mirror of
https://github.com/reactos/reactos.git
synced 2024-12-26 17:14:41 +00:00
Implemented some of gdi region functions.
svn path=/trunk/; revision=3262
This commit is contained in:
parent
52102e72fc
commit
8d9c181908
10 changed files with 5139 additions and 3419 deletions
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,9 @@
|
||||||
#ifndef _WIN32K_CLIPRGN_H
|
#ifndef _WIN32K_CLIPRGN_H
|
||||||
#define _WIN32K_CLIPRGN_H
|
#define _WIN32K_CLIPRGN_H
|
||||||
|
|
||||||
|
HRGN WINAPI SaveVisRgn(HDC hdc);
|
||||||
|
INT WINAPI SelectVisRgn(HDC hdc, HRGN hrgn);
|
||||||
|
|
||||||
int
|
int
|
||||||
STDCALL
|
STDCALL
|
||||||
W32kExcludeClipRect (
|
W32kExcludeClipRect (
|
||||||
|
|
|
@ -1,3 +1,10 @@
|
||||||
|
#ifndef __WIN32K_FLOAT_H
|
||||||
|
#define __WIN32K_FLOAT_H
|
||||||
|
|
||||||
|
#include <win32k/math.h>
|
||||||
|
#include <win32k/dc.h>
|
||||||
|
#include <freetype/freetype.h>
|
||||||
|
|
||||||
typedef struct tagFLOAT_POINT
|
typedef struct tagFLOAT_POINT
|
||||||
{
|
{
|
||||||
FLOAT x, y;
|
FLOAT x, y;
|
||||||
|
@ -18,7 +25,7 @@ static inline INT GDI_ROUND(FLOAT val)
|
||||||
static inline void INTERNAL_LPTODP_FLOAT(DC *dc, FLOAT_POINT *point)
|
static inline void INTERNAL_LPTODP_FLOAT(DC *dc, FLOAT_POINT *point)
|
||||||
{
|
{
|
||||||
FLOAT x, y;
|
FLOAT x, y;
|
||||||
|
|
||||||
/* Perform the transformation */
|
/* Perform the transformation */
|
||||||
x = point->x;
|
x = point->x;
|
||||||
y = point->y;
|
y = point->y;
|
||||||
|
@ -33,16 +40,17 @@ static inline void INTERNAL_LPTODP_FLOAT(DC *dc, FLOAT_POINT *point)
|
||||||
/* Performs a viewport-to-world transformation on the specified point (which
|
/* Performs a viewport-to-world transformation on the specified point (which
|
||||||
* is in integer format). Returns TRUE if successful, else FALSE.
|
* is in integer format). Returns TRUE if successful, else FALSE.
|
||||||
*/
|
*/
|
||||||
|
#if 0
|
||||||
static inline BOOL INTERNAL_DPTOLP(DC *dc, LPPOINT point)
|
static inline BOOL INTERNAL_DPTOLP(DC *dc, LPPOINT point)
|
||||||
{
|
{
|
||||||
FLOAT_POINT floatPoint;
|
FLOAT_POINT floatPoint;
|
||||||
|
|
||||||
/* Perform operation with floating point */
|
/* Perform operation with floating point */
|
||||||
floatPoint.x=(FLOAT)point->x;
|
floatPoint.x=(FLOAT)point->x;
|
||||||
floatPoint.y=(FLOAT)point->y;
|
floatPoint.y=(FLOAT)point->y;
|
||||||
if (!INTERNAL_DPTOLP_FLOAT(dc, &floatPoint))
|
if (!INTERNAL_DPTOLP_FLOAT(dc, &floatPoint))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* Round to integers */
|
/* Round to integers */
|
||||||
point->x = GDI_ROUND(floatPoint.x);
|
point->x = GDI_ROUND(floatPoint.x);
|
||||||
point->y = GDI_ROUND(floatPoint.y);
|
point->y = GDI_ROUND(floatPoint.y);
|
||||||
|
@ -56,17 +64,21 @@ static inline BOOL INTERNAL_DPTOLP(DC *dc, LPPOINT point)
|
||||||
static inline void INTERNAL_LPTODP(DC *dc, LPPOINT point)
|
static inline void INTERNAL_LPTODP(DC *dc, LPPOINT point)
|
||||||
{
|
{
|
||||||
FLOAT_POINT floatPoint;
|
FLOAT_POINT floatPoint;
|
||||||
|
|
||||||
/* Perform operation with floating point */
|
/* Perform operation with floating point */
|
||||||
floatPoint.x=(FLOAT)point->x;
|
floatPoint.x=(FLOAT)point->x;
|
||||||
floatPoint.y=(FLOAT)point->y;
|
floatPoint.y=(FLOAT)point->y;
|
||||||
INTERNAL_LPTODP_FLOAT(dc, &floatPoint);
|
INTERNAL_LPTODP_FLOAT(dc, &floatPoint);
|
||||||
|
|
||||||
/* Round to integers */
|
/* Round to integers */
|
||||||
point->x = GDI_ROUND(floatPoint.x);
|
point->x = GDI_ROUND(floatPoint.x);
|
||||||
point->y = GDI_ROUND(floatPoint.y);
|
point->y = GDI_ROUND(floatPoint.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MulDiv( x, y, z ) EngMulDiv( x, y, z )
|
||||||
|
|
||||||
#define XDPTOLP(dc,x) \
|
#define XDPTOLP(dc,x) \
|
||||||
(MulDiv(((x)-(dc)->vportOrgX), (dc)->wndExtX, (dc)->vportExtX) + (dc)->wndOrgX)
|
(MulDiv(((x)-(dc)->vportOrgX), (dc)->wndExtX, (dc)->vportExtX) + (dc)->wndOrgX)
|
||||||
#define YDPTOLP(dc,y) \
|
#define YDPTOLP(dc,y) \
|
||||||
|
@ -86,3 +98,5 @@ static inline void INTERNAL_LPTODP(DC *dc, LPPOINT point)
|
||||||
MulDiv((x), (dc)->vportExtX, (dc)->wndExtX)
|
MulDiv((x), (dc)->vportExtX, (dc)->wndExtX)
|
||||||
#define YLSTODS(dc,y) \
|
#define YLSTODS(dc,y) \
|
||||||
MulDiv((y), (dc)->vportExtY, (dc)->wndExtY)
|
MulDiv((y), (dc)->vportExtY, (dc)->wndExtY)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -2,32 +2,16 @@
|
||||||
#ifndef __WIN32K_REGION_H
|
#ifndef __WIN32K_REGION_H
|
||||||
#define __WIN32K_REGION_H
|
#define __WIN32K_REGION_H
|
||||||
|
|
||||||
#include <structs.h>
|
|
||||||
#include <win32k/gdiobj.h>
|
#include <win32k/gdiobj.h>
|
||||||
|
|
||||||
/* Internal functions */
|
#define RGNDATA_FreeRgn(hRgn) GDIOBJ_FreeObj((HGDIOBJ)hRgn, GO_REGION_MAGIC)
|
||||||
/*
|
#define RGNDATA_LockRgn(hRgn) ((PRGNDATA)GDIOBJ_LockObj((HGDIOBJ)hRgn, GO_REGION_MAGIC))
|
||||||
#define RGNDATA_PtrToHandle(pRgn) \
|
#define RGNDATA_UnlockRgn(hRgn) GDIOBJ_UnlockObj((HGDIOBJ)hRgn, GO_REGION_MAGIC)
|
||||||
((HRGN) GDIOBJ_PtrToHandle ((PGDIOBJ) pRgn, GO_REGION_MAGIC))
|
HRGN RGNDATA_AllocRgn(INT n);
|
||||||
*/
|
|
||||||
#define RGNDATA_HandleToPtr(hRgn) \
|
|
||||||
((RGNDATA *) GDIOBJ_LockObj ((HGDIOBJ) hRgn, GO_REGION_MAGIC))
|
|
||||||
|
|
||||||
/* call GDIOBJ_ReleaseObj when reference counting is added */
|
BOOL RGNDATA_InternalDelete( PRGNDATA Obj );
|
||||||
#define RGNDATA_Release(hRgn) {}
|
|
||||||
|
|
||||||
/* GDI logical region object */
|
|
||||||
typedef struct tagRGNOBJ
|
|
||||||
{
|
|
||||||
GDIOBJHDR header;
|
|
||||||
RGNDATA* rgn;
|
|
||||||
} RGNOBJ;
|
|
||||||
|
|
||||||
/* User entry points */
|
/* User entry points */
|
||||||
INT STDCALL
|
|
||||||
W32kGetBoxRgn(HRGN hRgn, PRECT Rect);
|
|
||||||
HRGN STDCALL
|
|
||||||
W32kCropRgn(HRGN hDest, HRGN hSrc, const RECT* Rect, const POINT* Point);
|
|
||||||
HRGN STDCALL
|
HRGN STDCALL
|
||||||
W32kUnionRectWithRgn(HRGN hDest, const RECT* Rect);
|
W32kUnionRectWithRgn(HRGN hDest, const RECT* Rect);
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
double atan (double __x);
|
double atan (double __x);
|
||||||
double atan2 (double __y, double __x);
|
double atan2 (double __y, double __x);
|
||||||
|
@ -207,3 +208,50 @@ double tan (double __x)
|
||||||
|
|
||||||
return __value;
|
return __value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//FIXME! Is there a better algorithm. like FT_MulDiv
|
||||||
|
INT STDCALL EngMulDiv(
|
||||||
|
INT nMultiplicand,
|
||||||
|
INT nMultiplier,
|
||||||
|
INT nDivisor)
|
||||||
|
{
|
||||||
|
#if SIZEOF_LONG_LONG >= 8
|
||||||
|
long long ret;
|
||||||
|
|
||||||
|
if (!nDivisor) return -1;
|
||||||
|
|
||||||
|
/* We want to deal with a positive divisor to simplify the logic. */
|
||||||
|
if (nDivisor < 0)
|
||||||
|
{
|
||||||
|
nMultiplicand = - nMultiplicand;
|
||||||
|
nDivisor = -nDivisor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the result is positive, we "add" to round. else, we subtract to round. */
|
||||||
|
if ( ( (nMultiplicand < 0) && (nMultiplier < 0) ) ||
|
||||||
|
( (nMultiplicand >= 0) && (nMultiplier >= 0) ) )
|
||||||
|
ret = (((long long)nMultiplicand * nMultiplier) + (nDivisor/2)) / nDivisor;
|
||||||
|
else
|
||||||
|
ret = (((long long)nMultiplicand * nMultiplier) - (nDivisor/2)) / nDivisor;
|
||||||
|
|
||||||
|
if ((ret > 2147483647) || (ret < -2147483647)) return -1;
|
||||||
|
return ret;
|
||||||
|
#else
|
||||||
|
if (!nDivisor) return -1;
|
||||||
|
|
||||||
|
/* We want to deal with a positive divisor to simplify the logic. */
|
||||||
|
if (nDivisor < 0)
|
||||||
|
{
|
||||||
|
nMultiplicand = - nMultiplicand;
|
||||||
|
nDivisor = -nDivisor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the result is positive, we "add" to round. else, we subtract to round. */
|
||||||
|
if ( ( (nMultiplicand < 0) && (nMultiplier < 0) ) ||
|
||||||
|
( (nMultiplicand >= 0) && (nMultiplier >= 0) ) )
|
||||||
|
return ((nMultiplicand * nMultiplier) + (nDivisor/2)) / nDivisor;
|
||||||
|
|
||||||
|
return ((nMultiplicand * nMultiplier) - (nDivisor/2)) / nDivisor;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: painting.c,v 1.1 2002/07/04 20:12:27 dwelch Exp $
|
/* $Id: painting.c,v 1.2 2002/07/18 21:59:18 ei Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -23,6 +23,7 @@
|
||||||
#include <user32/wininternal.h>
|
#include <user32/wininternal.h>
|
||||||
#include <include/rect.h>
|
#include <include/rect.h>
|
||||||
#include <win32k/coord.h>
|
#include <win32k/coord.h>
|
||||||
|
#include <win32k/region.h>
|
||||||
|
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
|
@ -47,7 +48,7 @@ PaintDoPaint(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags, ULONG ExFlags)
|
||||||
BOOL bIcon = (Window->Style & WS_MINIMIZE) &&
|
BOOL bIcon = (Window->Style & WS_MINIMIZE) &&
|
||||||
NtUserGetClassLong(hWnd, GCL_HICON);
|
NtUserGetClassLong(hWnd, GCL_HICON);
|
||||||
|
|
||||||
if (ExFlags & RDW_EX_DELAY_NCPAINT ||
|
if (ExFlags & RDW_EX_DELAY_NCPAINT ||
|
||||||
PaintHaveToDelayNCPaint(Window, 0))
|
PaintHaveToDelayNCPaint(Window, 0))
|
||||||
{
|
{
|
||||||
ExFlags |= RDW_EX_DELAY_NCPAINT;
|
ExFlags |= RDW_EX_DELAY_NCPAINT;
|
||||||
|
@ -66,12 +67,12 @@ PaintDoPaint(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags, ULONG ExFlags)
|
||||||
DCX_WINDOWPAINT | DCX_CACHE;
|
DCX_WINDOWPAINT | DCX_CACHE;
|
||||||
HRGN hRgnRet;
|
HRGN hRgnRet;
|
||||||
|
|
||||||
hRgnRet =
|
hRgnRet =
|
||||||
PaintUpdateNCRegion(Window,
|
PaintUpdateNCRegion(Window,
|
||||||
hRgn,
|
hRgn,
|
||||||
UNC_REGION | UNC_CHECK |
|
UNC_REGION | UNC_CHECK |
|
||||||
((ExFlags & RDW_EX_TOPFRAME) ? UNC_ENTIRE : 0) |
|
((ExFlags & RDW_EX_TOPFRAME) ? UNC_ENTIRE : 0) |
|
||||||
((ExFlags & RDW_EX_DELAY_NCPAINT) ?
|
((ExFlags & RDW_EX_DELAY_NCPAINT) ?
|
||||||
UNC_DELAY_NCPAINT : 0));
|
UNC_DELAY_NCPAINT : 0));
|
||||||
if (hRgnRet != NULL)
|
if (hRgnRet != NULL)
|
||||||
{
|
{
|
||||||
|
@ -91,8 +92,8 @@ PaintDoPaint(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags, ULONG ExFlags)
|
||||||
}
|
}
|
||||||
if (hRgnRet)
|
if (hRgnRet)
|
||||||
{
|
{
|
||||||
W32kOffsetRgn(hRgnRet,
|
W32kOffsetRgn(hRgnRet,
|
||||||
Window->WindowRect.left -
|
Window->WindowRect.left -
|
||||||
Window->ClientRect.left,
|
Window->ClientRect.left,
|
||||||
Window->WindowRect.top -
|
Window->WindowRect.top -
|
||||||
Window->ClientRect.top);
|
Window->ClientRect.top);
|
||||||
|
@ -123,7 +124,7 @@ PaintDoPaint(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags, ULONG ExFlags)
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID STATIC
|
VOID STATIC
|
||||||
PaintUpdateRgns(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags,
|
PaintUpdateRgns(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags,
|
||||||
BOOL First)
|
BOOL First)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -173,11 +174,11 @@ PaintRedrawWindow(HWND hWnd, const RECT* UpdateRect, HRGN UpdateRgn,
|
||||||
{
|
{
|
||||||
if (Window->UpdateRegion != NULL)
|
if (Window->UpdateRegion != NULL)
|
||||||
{
|
{
|
||||||
hRgn = W32kCropRgn(0, UpdateRgn, NULL, &Pt);
|
hRgn = REGION_CropRgn(0, UpdateRgn, NULL, &Pt);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Window->UpdateRegion = W32kCropRgn(0, UpdateRgn, &Rect, &Pt);
|
Window->UpdateRegion = REGION_CropRgn(0, UpdateRgn, &Rect, &Pt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (UpdateRect != NULL)
|
else if (UpdateRect != NULL)
|
||||||
|
@ -282,7 +283,7 @@ PaintingFindWinToRepaint(HWND hWnd, PW32THREAD Thread)
|
||||||
return(hFoundWnd);
|
return(hFoundWnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status =
|
Status =
|
||||||
ObmReferenceObjectByHandle(PsGetWin32Process()->WindowStation->HandleTable,
|
ObmReferenceObjectByHandle(PsGetWin32Process()->WindowStation->HandleTable,
|
||||||
hWnd,
|
hWnd,
|
||||||
otWindow,
|
otWindow,
|
||||||
|
@ -329,7 +330,7 @@ PaintUpdateNCRegion(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
|
||||||
Window->Flags &= ~WINDOWOBJECT_NEED_NCPAINT;
|
Window->Flags &= ~WINDOWOBJECT_NEED_NCPAINT;
|
||||||
if (Window->UpdateRegion > (HANDLE)1)
|
if (Window->UpdateRegion > (HANDLE)1)
|
||||||
{
|
{
|
||||||
hRgnRet = W32kCropRgn(hRgn, Window->UpdateRegion, NULL, NULL);
|
hRgnRet = REGION_CropRgn(hRgn, Window->UpdateRegion, NULL, NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -338,7 +339,7 @@ PaintUpdateNCRegion(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
|
||||||
return(hRgnRet);
|
return(hRgnRet);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Window->Flags & WINDOWOBJECT_NEED_NCPAINT &&
|
if (Window->Flags & WINDOWOBJECT_NEED_NCPAINT &&
|
||||||
!PaintHaveToDelayNCPaint(Window, Flags))
|
!PaintHaveToDelayNCPaint(Window, Flags))
|
||||||
{
|
{
|
||||||
RECT UpdateRegionBox;
|
RECT UpdateRegionBox;
|
||||||
|
@ -355,7 +356,7 @@ PaintUpdateNCRegion(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
|
||||||
Rect.right != ClientRect.right || Rect.right != ClientRect.right)
|
Rect.right != ClientRect.right || Rect.right != ClientRect.right)
|
||||||
{
|
{
|
||||||
hClip = Window->UpdateRegion;
|
hClip = Window->UpdateRegion;
|
||||||
Window->UpdateRegion = W32kCropRgn(hRgn, hClip,
|
Window->UpdateRegion = REGION_CropRgn(hRgn, hClip,
|
||||||
&Rect, NULL);
|
&Rect, NULL);
|
||||||
if (Flags & UNC_REGION)
|
if (Flags & UNC_REGION)
|
||||||
{
|
{
|
||||||
|
@ -365,7 +366,7 @@ PaintUpdateNCRegion(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
|
||||||
|
|
||||||
if (Flags & UNC_CHECK)
|
if (Flags & UNC_CHECK)
|
||||||
{
|
{
|
||||||
W32kGetBoxRgn(Window->UpdateRegion, &UpdateRegionBox);
|
W32kGetRgnBox(Window->UpdateRegion, &UpdateRegionBox);
|
||||||
if (W32kIsEmptyRect(&UpdateRegionBox))
|
if (W32kIsEmptyRect(&UpdateRegionBox))
|
||||||
{
|
{
|
||||||
W32kDeleteObject(Window->UpdateRegion);
|
W32kDeleteObject(Window->UpdateRegion);
|
||||||
|
@ -377,7 +378,7 @@ PaintUpdateNCRegion(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
|
||||||
|
|
||||||
if (!hClip && Window->UpdateRegion && Flags & UNC_REGION)
|
if (!hClip && Window->UpdateRegion && Flags & UNC_REGION)
|
||||||
{
|
{
|
||||||
hRgnRet = W32kCropRgn(hRgn, Window->UpdateRegion, NULL,
|
hRgnRet = REGION_CropRgn(hRgn, Window->UpdateRegion, NULL,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -398,7 +399,7 @@ PaintUpdateNCRegion(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
|
||||||
{
|
{
|
||||||
if (Window->UpdateRegion > (HANDLE)1 && Flags & UNC_REGION)
|
if (Window->UpdateRegion > (HANDLE)1 && Flags & UNC_REGION)
|
||||||
{
|
{
|
||||||
hRgnRet = W32kCropRgn(hRgn, Window->UpdateRegion, NULL, NULL);
|
hRgnRet = REGION_CropRgn(hRgn, Window->UpdateRegion, NULL, NULL);
|
||||||
}
|
}
|
||||||
else if (Window->UpdateRegion == (HANDLE)1 && Flags & UNC_UPDATE)
|
else if (Window->UpdateRegion == (HANDLE)1 && Flags & UNC_UPDATE)
|
||||||
{
|
{
|
||||||
|
@ -413,7 +414,7 @@ PaintUpdateNCRegion(PWINDOW_OBJECT Window, HRGN hRgn, ULONG Flags)
|
||||||
|
|
||||||
if (hClip == NULL && Flags & UNC_ENTIRE)
|
if (hClip == NULL && Flags & UNC_ENTIRE)
|
||||||
{
|
{
|
||||||
if (RtlCompareMemory(&Window->WindowRect, &Window->ClientRect,
|
if (RtlCompareMemory(&Window->WindowRect, &Window->ClientRect,
|
||||||
sizeof(RECT)) == sizeof(RECT))
|
sizeof(RECT)) == sizeof(RECT))
|
||||||
{
|
{
|
||||||
hClip = (HANDLE)1;
|
hClip = (HANDLE)1;
|
||||||
|
@ -459,7 +460,7 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* lPs)
|
||||||
RECT ClipRect;
|
RECT ClipRect;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
Status =
|
Status =
|
||||||
ObmReferenceObjectByHandle(PsGetWin32Process()->WindowStation->HandleTable,
|
ObmReferenceObjectByHandle(PsGetWin32Process()->WindowStation->HandleTable,
|
||||||
hWnd,
|
hWnd,
|
||||||
otWindow,
|
otWindow,
|
||||||
|
@ -469,9 +470,9 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* lPs)
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
IsIcon = Window->Style & WS_MINIMIZE &&
|
IsIcon = Window->Style & WS_MINIMIZE &&
|
||||||
NtUserGetClassLong(Window->Self, GCL_HICON);
|
NtUserGetClassLong(Window->Self, GCL_HICON);
|
||||||
|
|
||||||
Window->Flags &= ~WINDOWOBJECT_NEED_BEGINPAINT;
|
Window->Flags &= ~WINDOWOBJECT_NEED_BEGINPAINT;
|
||||||
|
|
||||||
/* Send WM_NCPAINT */
|
/* Send WM_NCPAINT */
|
||||||
|
@ -499,8 +500,8 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* lPs)
|
||||||
{
|
{
|
||||||
if (UpdateRegion != NULL)
|
if (UpdateRegion != NULL)
|
||||||
{
|
{
|
||||||
W32kOffsetRgn(UpdateRegion,
|
W32kOffsetRgn(UpdateRegion,
|
||||||
Window->WindowRect.left -
|
Window->WindowRect.left -
|
||||||
Window->ClientRect.left,
|
Window->ClientRect.left,
|
||||||
Window->WindowRect.top -
|
Window->WindowRect.top -
|
||||||
Window->ClientRect.top);
|
Window->ClientRect.top);
|
||||||
|
@ -522,7 +523,7 @@ NtUserBeginPaint(HWND hWnd, PAINTSTRUCT* lPs)
|
||||||
{
|
{
|
||||||
BOOLEAN Result;
|
BOOLEAN Result;
|
||||||
Window->Flags &= ~WINDOWOBJECT_NEED_ERASEBACKGRD;
|
Window->Flags &= ~WINDOWOBJECT_NEED_ERASEBACKGRD;
|
||||||
Result = NtUserSendMessage(hWnd,
|
Result = NtUserSendMessage(hWnd,
|
||||||
IsIcon ? WM_ICONERASEBKGND : WM_ERASEBKGND,
|
IsIcon ? WM_ICONERASEBKGND : WM_ERASEBKGND,
|
||||||
(WPARAM)lPs->hdc,
|
(WPARAM)lPs->hdc,
|
||||||
0);
|
0);
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <ddk/ntddk.h>
|
#include <ddk/ntddk.h>
|
||||||
#include <win32k/dc.h>
|
#include <win32k/dc.h>
|
||||||
|
#include <win32k/region.h>
|
||||||
#include <win32k/cliprgn.h>
|
#include <win32k/cliprgn.h>
|
||||||
|
|
||||||
// #define NDEBUG
|
// #define NDEBUG
|
||||||
|
@ -14,43 +15,39 @@ HRGN WINAPI SaveVisRgn(HDC hdc)
|
||||||
HRGN copy;
|
HRGN copy;
|
||||||
PRGNDATA obj, copyObj;
|
PRGNDATA obj, copyObj;
|
||||||
PDC dc = DC_HandleToPtr(hdc);
|
PDC dc = DC_HandleToPtr(hdc);
|
||||||
/*ei
|
|
||||||
if (!dc) return 0;
|
if (!dc) return 0;
|
||||||
|
|
||||||
obj = RGNDATA_HandleToPtr(dc->w.hVisRgn);
|
obj = RGNDATA_LockRgn(dc->w.hVisRgn);
|
||||||
|
|
||||||
if(!(copy = CreateRectRgn(0, 0, 0, 0)))
|
if(!(copy = W32kCreateRectRgn(0, 0, 0, 0)))
|
||||||
{
|
{
|
||||||
GDI_ReleaseObj(dc->w.hVisRgn);
|
RGNDATA_UnlockRgn(dc->w.hVisRgn);
|
||||||
GDI_ReleaseObj(hdc);
|
DC_ReleasePtr(hdc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
CombineRgn(copy, dc->w.hVisRgn, 0, RGN_COPY);
|
W32kCombineRgn(copy, dc->w.hVisRgn, 0, RGN_COPY);
|
||||||
copyObj = RGNDATA_HandleToPtr(copy);
|
copyObj = RGNDATA_LockRgn(copy);
|
||||||
*/
|
|
||||||
/* copyObj->header.hNext = obj->header.hNext;
|
/* copyObj->header.hNext = obj->header.hNext;
|
||||||
header.hNext = copy; */
|
header.hNext = copy; */
|
||||||
DC_ReleasePtr( hdc );
|
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
|
|
||||||
INT16 WINAPI SelectVisRgn(HDC hdc, HRGN hrgn)
|
INT WINAPI SelectVisRgn(HDC hdc, HRGN hrgn)
|
||||||
{
|
{
|
||||||
return ERROR;
|
|
||||||
/*ei
|
|
||||||
int retval;
|
int retval;
|
||||||
DC *dc;
|
DC *dc;
|
||||||
|
|
||||||
if (!hrgn) return ERROR;
|
if (!hrgn) return ERROR;
|
||||||
if (!(dc = DC_HandleToPtr(hdc))) return ERROR;
|
if (!(dc = DC_HandleToPtr(hdc))) return ERROR;
|
||||||
|
|
||||||
dc->flags &= ~DC_DIRTY;
|
dc->w.flags &= ~DC_DIRTY;
|
||||||
|
|
||||||
retval = CombineRgn(dc->hVisRgn, hrgn, 0, RGN_COPY);
|
retval = W32kCombineRgn(dc->w.hVisRgn, hrgn, 0, RGN_COPY);
|
||||||
CLIPPING_UpdateGCRegion(dc);
|
//ei CLIPPING_UpdateGCRegion(dc);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int STDCALL W32kExcludeClipRect(HDC hDC,
|
int STDCALL W32kExcludeClipRect(HDC hDC,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* GDIOBJ.C - GDI object manipulation routines
|
* GDIOBJ.C - GDI object manipulation routines
|
||||||
*
|
*
|
||||||
* $Id: gdiobj.c,v 1.12 2002/07/13 21:37:27 ei Exp $
|
* $Id: gdiobj.c,v 1.13 2002/07/18 21:59:18 ei Exp $
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -213,7 +213,8 @@ BOOL GDIOBJ_FreeObj(HGDIOBJ hObj, WORD Magic)
|
||||||
Obj = (PGDIOBJ)((PCHAR)handleEntry->pObject + sizeof(GDIOBJHDR));
|
Obj = (PGDIOBJ)((PCHAR)handleEntry->pObject + sizeof(GDIOBJHDR));
|
||||||
switch( handleEntry->wMagic ){
|
switch( handleEntry->wMagic ){
|
||||||
case GO_REGION_MAGIC:
|
case GO_REGION_MAGIC:
|
||||||
|
bRet = RGNDATA_InternalDelete( (PRGNDATA) Obj );
|
||||||
|
break;
|
||||||
case GO_PEN_MAGIC:
|
case GO_PEN_MAGIC:
|
||||||
case GO_PALETTE_MAGIC:
|
case GO_PALETTE_MAGIC:
|
||||||
case GO_BITMAP_MAGIC:
|
case GO_BITMAP_MAGIC:
|
||||||
|
@ -290,6 +291,7 @@ BOOL GDIOBJ_UnlockObj( HGDIOBJ hObj, WORD Magic )
|
||||||
|
|
||||||
if( objectHeader->dwCount == 0x80000000 ){
|
if( objectHeader->dwCount == 0x80000000 ){
|
||||||
//delayed object release
|
//delayed object release
|
||||||
|
objectHeader->dwCount = 0;
|
||||||
ExReleaseFastMutex(&RefCountHandling);
|
ExReleaseFastMutex(&RefCountHandling);
|
||||||
DPRINT("GDIOBJ_UnlockObj: delayed delete\n");
|
DPRINT("GDIOBJ_UnlockObj: delayed delete\n");
|
||||||
return GDIOBJ_FreeObj( hObj, Magic );
|
return GDIOBJ_FreeObj( hObj, Magic );
|
||||||
|
@ -439,31 +441,6 @@ HGDIOBJ STDCALL W32kGetStockObject(INT Object)
|
||||||
|
|
||||||
BOOL STDCALL W32kDeleteObject(HGDIOBJ hObject)
|
BOOL STDCALL W32kDeleteObject(HGDIOBJ hObject)
|
||||||
{
|
{
|
||||||
/* ei: Now this is handled in gdiobj.c
|
|
||||||
PGDIOBJ Obj;
|
|
||||||
PGDIOBJHDR ObjHdr;
|
|
||||||
WORD magic;
|
|
||||||
|
|
||||||
magic = GDIOBJ_GetHandleMagic (hObject);
|
|
||||||
Obj = GDIOBJ_HandleToPtr( hObject, GO_MAGIC_DONTCARE );
|
|
||||||
if( !Obj )
|
|
||||||
return FALSE;
|
|
||||||
ObjHdr = (PGDIOBJHDR)(((PCHAR)Obj) - sizeof (GDIOBJHDR));
|
|
||||||
switch( magic )
|
|
||||||
{
|
|
||||||
case GO_BITMAP_MAGIC: {
|
|
||||||
DPRINT( "Deleting bitmap\n" );
|
|
||||||
ExFreePool( ((PBITMAPOBJ)Obj)->bitmap.bmBits );
|
|
||||||
BITMAPOBJ_FreeBitmap( Obj );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
DPRINT( "W32kDeleteObject: Deleting object of unknown type %x\n", magic );
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
*/
|
|
||||||
return GDIOBJ_FreeObj( hObject, GO_MAGIC_DONTCARE );
|
return GDIOBJ_FreeObj( hObject, GO_MAGIC_DONTCARE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -46,7 +46,6 @@ STUB(EngMapFontFile)
|
||||||
STUB(EngMapModule)
|
STUB(EngMapModule)
|
||||||
STUB(EngMarkBandingSurface)
|
STUB(EngMarkBandingSurface)
|
||||||
STUB(EngMovePointer)
|
STUB(EngMovePointer)
|
||||||
STUB(EngMulDiv)
|
|
||||||
STUB(EngMultiByteToUnicodeN)
|
STUB(EngMultiByteToUnicodeN)
|
||||||
STUB(EngMultiByteToWideChar)
|
STUB(EngMultiByteToWideChar)
|
||||||
STUB(EngProbeForRead)
|
STUB(EngProbeForRead)
|
||||||
|
|
Loading…
Reference in a new issue