From a0e70e46a29a6183ab955ae9196535f258e0036f Mon Sep 17 00:00:00 2001 From: Eugene Ingerman Date: Sat, 13 Jul 2002 21:37:27 +0000 Subject: [PATCH] Added reference counting and deferred deletion for GDI objects. svn path=/trunk/; revision=3215 --- reactos/include/win32k/bitmaps.h | 46 +-- reactos/include/win32k/brush.h | 11 +- reactos/include/win32k/dc.h | 43 +-- reactos/include/win32k/debug1.h | 12 +- reactos/include/win32k/gdiobj.h | 14 +- reactos/include/win32k/pen.h | 10 +- reactos/include/win32k/region.h | 24 +- reactos/include/win32k/text.h | 12 +- reactos/lib/gdi32/objects/pen.c | 7 + reactos/subsys/win32k/freetype/grfont.c | 8 +- reactos/subsys/win32k/main/dllmain.c | 8 +- reactos/subsys/win32k/objects/bitmaps.c | 127 +++++---- reactos/subsys/win32k/objects/brush.c | 49 ++-- reactos/subsys/win32k/objects/cliprgn.c | 45 +++ reactos/subsys/win32k/objects/color.c | 28 +- reactos/subsys/win32k/objects/coord.c | 73 ++--- reactos/subsys/win32k/objects/dc.c | 348 ++++++++++++----------- reactos/subsys/win32k/objects/dib.c | 78 ++--- reactos/subsys/win32k/objects/fillshap.c | 21 +- reactos/subsys/win32k/objects/gdiobj.c | 257 +++++++++++++++-- reactos/subsys/win32k/objects/line.c | 44 ++- reactos/subsys/win32k/objects/objconv.c | 31 +- reactos/subsys/win32k/objects/path.c | 82 +++--- reactos/subsys/win32k/objects/pen.c | 10 +- reactos/subsys/win32k/objects/region.c | 6 +- reactos/subsys/win32k/objects/text.c | 80 ++++-- 26 files changed, 957 insertions(+), 517 deletions(-) diff --git a/reactos/include/win32k/bitmaps.h b/reactos/include/win32k/bitmaps.h index 341f8aab979..749a4dd2264 100644 --- a/reactos/include/win32k/bitmaps.h +++ b/reactos/include/win32k/bitmaps.h @@ -17,7 +17,7 @@ typedef struct _BITMAPOBJ { BITMAP bitmap; SIZE size; /* For SetBitmapDimension() */ - + DDBITMAP *DDBitmap; /* For device-independent bitmaps: */ @@ -27,12 +27,16 @@ typedef struct _BITMAPOBJ /* Internal interface */ #define BITMAPOBJ_AllocBitmap() \ - ((PBITMAPOBJ) GDIOBJ_AllocObject (sizeof (BITMAPOBJ), GO_BITMAP_MAGIC)) -#define BITMAPOBJ_FreeBitmap(hBMObj) GDIOBJ_FreeObject((HGDIOBJ) hBMObj, GO_BITMAP_MAGIC) + ((HBITMAP) GDIOBJ_AllocObj (sizeof (BITMAPOBJ), GO_BITMAP_MAGIC)) +#define BITMAPOBJ_FreeBitmap(hBMObj) \ + GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GO_BITMAP_MAGIC) #define BITMAPOBJ_HandleToPtr(hBMObj) \ - ((PBITMAPOBJ) GDIOBJ_HandleToPtr ((HGDIOBJ) hBMObj, GO_BITMAP_MAGIC)) -#define BITMAPOBJ_PtrToHandle(hBMObj) \ - ((HBITMAP) GDIOBJ_PtrToHandle ((PGDIOBJ) hBMObj, GO_BITMAP_MAGIC)) + ((PBITMAPOBJ) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GO_BITMAP_MAGIC)) +#define BITMAPOBJ_ReleasePtr(hBMObj) \ + GDIOBJ_UnlockObj ((HGDIOBJ) hBMObj, GO_BITMAP_MAGIC) + +/*#define BITMAPOBJ_PtrToHandle(hBMObj) \ + ((HBITMAP) GDIOBJ_PtrToHandle ((PGDIOBJ) hBMObj, GO_BITMAP_MAGIC))*/ #define BITMAPOBJ_LockBitmap(hBMObj) GDIOBJ_LockObject ((HGDIOBJ) hBMObj) #define BITMAPOBJ_UnlockBitmap(hBMObj) GDIOBJ_UnlockObject ((HGDIOBJ) hBMObj) @@ -41,6 +45,8 @@ HBITMAP BITMAPOBJ_CopyBitmap (HBITMAP hBitmap); int DIB_GetDIBWidthBytes (int width, int depth); int DIB_GetDIBImageBytes (int width, int height, int depth); int DIB_BitmapInfoSize (const BITMAPINFO * info, WORD coloruse); +INT BITMAP_GetObject(BITMAPOBJ * bmp, INT count, LPVOID buffer); +BOOL Bitmap_InternalDelete( PBITMAPOBJ pBmp ); /* User Entry Points */ BOOL @@ -110,7 +116,7 @@ W32kExtFloodFill ( HDC hDC, INT XStart, INT YStart, - COLORREF Color, + COLORREF Color, UINT FillType ); BOOL @@ -169,7 +175,7 @@ W32kMaskBlt ( INT Width, INT Height, HDC hDCSrc, - INT XSrc, + INT XSrc, INT YSrc, HBITMAP hMaskBitmap, INT xMask, @@ -181,13 +187,13 @@ STDCALL W32kPlgBlt ( HDC hDCDest, CONST POINT * Point, - HDC hDCSrc, - INT XSrc, - INT YSrc, - INT Width, + HDC hDCSrc, + INT XSrc, + INT YSrc, + INT Width, INT Height, HBITMAP hMaskBitmap, - INT xMask, + INT xMask, INT yMask ); LONG @@ -267,8 +273,8 @@ W32kStretchBlt ( HDC hDCSrc, INT XOriginSrc, INT YOriginSrc, - INT WidthSrc, - INT HeightSrc, + INT WidthSrc, + INT HeightSrc, DWORD ROP ); INT @@ -279,13 +285,13 @@ W32kStretchDIBits ( INT YDest, INT DestWidth, INT DestHeight, - INT XSrc, - INT YSrc, - INT SrcWidth, - INT SrcHeight, + INT XSrc, + INT YSrc, + INT SrcWidth, + INT SrcHeight, CONST VOID * Bits, CONST BITMAPINFO * BitsInfo, - UINT Usage, + UINT Usage, DWORD ROP ); #endif diff --git a/reactos/include/win32k/brush.h b/reactos/include/win32k/brush.h index 3e020c29953..5809a0d970f 100644 --- a/reactos/include/win32k/brush.h +++ b/reactos/include/win32k/brush.h @@ -8,14 +8,15 @@ #define NB_HATCH_STYLES 6 #define BRUSHOBJ_AllocBrush() \ - ((PBRUSHOBJ) GDIOBJ_AllocObject (sizeof (BRUSHOBJ), GO_BRUSH_MAGIC)) -#define BRUSHOBJ_FreeBrush(hBrush) GDIOBJ_FreeObject((HGDIOBJ)hBrush) -#define BRUSHOBJ_HandleToPtr(hBrush) \ + ((HBRUSH) GDIOBJ_AllocObj (sizeof (BRUSHOBJ), GO_BRUSH_MAGIC)) +#define BRUSHOBJ_FreeBrush(hBrush) GDIOBJ_FreeObj((HGDIOBJ)hBrush, GO_BRUSH_MAGIC) +/*#define BRUSHOBJ_HandleToPtr(hBrush) \ ((PBRUSHOBJ) GDIOBJ_HandleToPtr ((HGDIOBJ) hBrush, GO_BRUSH_MAGIC)) #define BRUSHOBJ_PtrToHandle(pBrushObj) \ ((HBRUSH) GDIOBJ_PtrToHandle ((PGDIOBJ) pBrushObj, GO_BRUSH_MAGIC)) -#define BRUSHOBJ_LockBrush(hBrush) GDIOBJ_LockObject((HGDIOBJ)hBrush) -#define BRUSHOBJ_UnlockBrush(hBrush) GDIOBJ_UnlockObject((HGDIOBJ)hBrush) +*/ +#define BRUSHOBJ_LockBrush(hBrush) GDIOBJ_LockObj((HGDIOBJ)hBrush, GO_BRUSH_MAGIC) +#define BRUSHOBJ_UnlockBrush(hBrush) GDIOBJ_UnlockObj((HGDIOBJ)hBrush, GO_BRUSH_MAGIC) HBRUSH STDCALL diff --git a/reactos/include/win32k/dc.h b/reactos/include/win32k/dc.h index cba38df5d85..28d8dcc7159 100644 --- a/reactos/include/win32k/dc.h +++ b/reactos/include/win32k/dc.h @@ -39,7 +39,7 @@ typedef struct _DEVICECAPS WORD pad2[6]; /* 92-102: reserved */ WORD sizePalette; /* 104: entries in system palette */ WORD numReserved; /* 106: reserved entries */ - WORD colorRes; /* 108: color resolution */ + WORD colorRes; /* 108: color resolution */ } DEVICECAPS, *PDEVICECAPS; typedef struct _WIN_DC_INFO @@ -58,7 +58,7 @@ typedef struct _WIN_DC_INFO // #if 0 HANDLE hDevice; HPALETTE hPalette; - + GdiPath path; // #endif @@ -69,44 +69,44 @@ typedef struct _WIN_DC_INFO WORD backgroundMode; COLORREF backgroundColor; COLORREF textColor; - + short brushOrgX; short brushOrgY; - + WORD textAlign; /* Text alignment from SetTextAlign() */ short charExtra; /* Spacing from SetTextCharacterExtra() */ short breakTotalExtra; /* Total extra space for justification */ short breakCount; /* Break char. count */ short breakExtra; /* breakTotalExtra / breakCount */ short breakRem; /* breakTotalExtra % breakCount */ - + RECT totalExtent; BYTE bitsPerPixel; - + INT MapMode; INT GraphicsMode; /* Graphics mode */ INT DCOrgX; /* DC origin */ INT DCOrgY; - + #if 0 FARPROC lpfnPrint; /* AbortProc for Printing */ #endif - + INT CursPosX; /* Current position */ INT CursPosY; INT ArcDirection; - + XFORM xformWorld2Wnd; /* World-to-window transformation */ XFORM xformWorld2Vport; /* World-to-viewport transformation */ XFORM xformVport2World; /* Inverse of the above transformation */ - BOOL vport2WorldValid; /* Is xformVport2World valid? */ + BOOL vport2WorldValid; /* Is xformVport2World valid? */ } WIN_DC_INFO; /* DC flags */ #define DC_MEMORY 0x0001 /* It is a memory DC */ #define DC_SAVED 0x0002 /* It is a saved DC */ #define DC_DIRTY 0x0004 /* hVisRgn has to be updated */ -#define DC_THUNKHOOK 0x0008 /* DC hook is in the 16-bit code */ +#define DC_THUNKHOOK 0x0008 /* DC hook is in the 16-bit code */ #define GDI_DC_TYPE (1) @@ -114,7 +114,7 @@ typedef struct _DC { HDC hSelf; HDC hNext; - DHPDEV PDev; + DHPDEV PDev; DEVMODEW DMW; HSURF FillPatternSurfaces[HS_DDI_MAX]; GDIINFO GDIInfo; @@ -124,7 +124,7 @@ typedef struct _DC DRIVER_FUNCTIONS DriverFunctions; PWSTR DriverName; HANDLE DeviceDriver; - + INT wndOrgX; /* Window origin */ INT wndOrgY; INT wndExtX; /* Window extent */ @@ -141,17 +141,24 @@ typedef struct _DC /* Internal functions */ +/* #define DC_PtrToHandle(pDC) \ ((HDC) GDIOBJ_PtrToHandle ((PGDIOBJ) pDC, GO_DC_MAGIC)) +*/ + #define DC_HandleToPtr(hDC) \ - ((PDC) GDIOBJ_HandleToPtr ((HGDIOBJ) hDC, GO_DC_MAGIC)) + ((PDC) GDIOBJ_LockObj ((HGDIOBJ) hDC, GO_DC_MAGIC)) +#define DC_ReleasePtr(hDC) \ + GDIOBJ_UnlockObj ((HGDIOBJ) hDC, GO_DC_MAGIC) + HDC RetrieveDisplayHDC(VOID); -PDC DC_AllocDC(LPCWSTR Driver); -void DC_InitDC(PDC DCToInit); -PDC DC_FindOpenDC(LPCWSTR Driver); -void DC_FreeDC(PDC DCToFree); +HDC DC_AllocDC(LPCWSTR Driver); +void DC_InitDC(HDC DCToInit); +HDC DC_FindOpenDC(LPCWSTR Driver); +void DC_FreeDC(HDC DCToFree); HDC DC_GetNextDC (PDC pDC); void DC_SetNextDC (PDC pDC, HDC hNextDC); +BOOL DC_InternalDeleteDC( PDC DCToDelete ); void DC_UpdateXforms(PDC dc); BOOL DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest); diff --git a/reactos/include/win32k/debug1.h b/reactos/include/win32k/debug1.h index f1131e288a4..7618cb86c65 100644 --- a/reactos/include/win32k/debug1.h +++ b/reactos/include/win32k/debug1.h @@ -4,7 +4,7 @@ * FILE: include/internal/debug.h * PURPOSE: Useful debugging macros * PROGRAMMER: David Welch (welch@mcmail.com) - * UPDATE HISTORY: + * UPDATE HISTORY: * 28/05/98: Created */ @@ -25,8 +25,10 @@ #ifndef NASSERT #define assert(x) if (!(x)) {DbgPrint("Assertion "#x" failed at %s:%d\n", __FILE__,__LINE__); KeBugCheck(0); } +#define ASSERT(x) assert(x) #else #define assert(x) +#define ASSERT(x) #endif #define DPRINT1(args...) do { DbgPrint("(%s:%d) ",__FILE__,__LINE__); DbgPrint(args); ExAllocatePool(NonPagedPool,0); } while(0); @@ -81,16 +83,16 @@ extern unsigned int old_idt_valid; * NOTES: * The variable to watch must be aligned to its length (i.e. a dword * breakpoint must be aligned to a dword boundary) - * + * * A fatal exception will be generated on the access to the variable. * It is (at the moment) only really useful for catching undefined * pointers if you know the variable effected but not the buggy - * routine. - * + * routine. + * * FIXME: Extend to call out to kernel debugger on breakpoint * Add support for I/O breakpoints * REFERENCES: See the i386 programmer manual for more details - */ + */ void set_breakpoint(unsigned int i, unsigned int addr, unsigned int type, unsigned int len); diff --git a/reactos/include/win32k/gdiobj.h b/reactos/include/win32k/gdiobj.h index d9c475ed76c..eee272fa501 100644 --- a/reactos/include/win32k/gdiobj.h +++ b/reactos/include/win32k/gdiobj.h @@ -1,6 +1,6 @@ /* * GDI object common header definition - * + * * (RJJ) taken from WINE */ @@ -56,6 +56,7 @@ typedef struct _GDIOBJHDR { WORD wTableIndex; + DWORD dwCount; //reference count. } GDIOBJHDR, *PGDIOBJHDR; typedef PVOID PGDIOBJ; @@ -70,14 +71,15 @@ typedef struct _GDI_HANDLE_ENTRY typedef struct _GDI_HANDLE_TABLE { WORD wTableSize; - GDI_HANDLE_ENTRY Handles [0]; + GDI_HANDLE_ENTRY Handles [1]; } GDI_HANDLE_TABLE, *PGDI_HANDLE_TABLE; -PGDIOBJ GDIOBJ_AllocObject(WORD Size, WORD Magic); -BOOL GDIOBJ_FreeObject (PGDIOBJ Obj, WORD Magic); -HGDIOBJ GDIOBJ_PtrToHandle (PGDIOBJ Obj, WORD Magic); -PGDIOBJ GDIOBJ_HandleToPtr (HGDIOBJ Obj, WORD Magic); +HGDIOBJ GDIOBJ_AllocObj(WORD Size, WORD Magic); +BOOL GDIOBJ_FreeObj (HGDIOBJ Obj, WORD Magic); +PGDIOBJ GDIOBJ_LockObj (HGDIOBJ Obj, WORD Magic); +BOOL GDIOBJ_UnlockObj (HGDIOBJ Obj, WORD Magic); WORD GDIOBJ_GetHandleMagic (HGDIOBJ ObjectHandle); +VOID STDCALL W32kDumpGdiObjects( INT Process ); #endif diff --git a/reactos/include/win32k/pen.h b/reactos/include/win32k/pen.h index 1bf7ce2fdb0..468427212c9 100644 --- a/reactos/include/win32k/pen.h +++ b/reactos/include/win32k/pen.h @@ -13,14 +13,16 @@ typedef struct /* Internal interface */ #define PENOBJ_AllocPen() \ - ((PPENOBJ) GDIOBJ_AllocObject (sizeof (PENOBJ), GO_PEN_MAGIC)) -#define PENOBJ_FreePen(hBMObj) GDIOBJ_FreeObject((HGDIOBJ) hBMObj) + ((HPEN) GDIOBJ_AllocObj (sizeof (PENOBJ), GO_PEN_MAGIC)) +#define PENOBJ_FreePen(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj) +/* #define PENOBJ_HandleToPtr(hBMObj) \ ((PPENOBJ) GDIOBJ_HandleToPtr ((HGDIOBJ) hBMObj, GO_PEN_MAGIC)) #define PENOBJ_PtrToHandle(hBMObj) \ ((HPEN) GDIOBJ_PtrToHandle ((PGDIOBJ) hBMObj, GO_PEN_MAGIC)) -#define PENOBJ_LockPen(hBMObj) GDIOBJ_LockObject ((HGDIOBJ) hBMObj) -#define PENOBJ_UnlockPen(hBMObj) GDIOBJ_UnlockObject ((HGDIOBJ) hBMObj) +*/ +#define PENOBJ_LockPen(hBMObj) ((PPENOBJ)GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GO_PEN_MAGIC)) +#define PENOBJ_UnlockPen(hBMObj) GDIOBJ_UnlockObj ((HGDIOBJ) hBMObj, GO_PEN_MAGIC) HPEN STDCALL W32kCreatePen(INT PenStyle, INT Width, diff --git a/reactos/include/win32k/region.h b/reactos/include/win32k/region.h index b6fd2e410c2..ae73c331f2f 100644 --- a/reactos/include/win32k/region.h +++ b/reactos/include/win32k/region.h @@ -2,6 +2,28 @@ #ifndef __WIN32K_REGION_H #define __WIN32K_REGION_H +#include +#include + +/* Internal functions */ +/* +#define RGNDATA_PtrToHandle(pRgn) \ + ((HRGN) GDIOBJ_PtrToHandle ((PGDIOBJ) pRgn, GO_REGION_MAGIC)) +*/ +#define RGNDATA_HandleToPtr(hRgn) \ + ((RGNDATA *) GDIOBJ_LockObj ((HGDIOBJ) hRgn, GO_REGION_MAGIC)) + +/* call GDIOBJ_ReleaseObj when reference counting is added */ +#define RGNDATA_Release(hRgn) {} + +/* GDI logical region object */ +typedef struct tagRGNOBJ +{ + GDIOBJHDR header; + RGNDATA* rgn; +} RGNOBJ; + +/* User entry points */ INT STDCALL W32kGetBoxRgn(HRGN hRgn, PRECT Rect); HRGN STDCALL @@ -124,4 +146,4 @@ W32kSetRectRgn(HRGN hRgn, INT BottomRect); #endif - + diff --git a/reactos/include/win32k/text.h b/reactos/include/win32k/text.h index 27d5d18dc28..31ff77b41a3 100644 --- a/reactos/include/win32k/text.h +++ b/reactos/include/win32k/text.h @@ -11,14 +11,16 @@ typedef struct /* Internal interface */ #define TEXTOBJ_AllocText() \ - ((PTEXTOBJ) GDIOBJ_AllocObject (sizeof (TEXTOBJ), GO_FONT_MAGIC)) -#define TEXTOBJ_FreeText(hBMObj) GDIOBJ_FreeObject((HGDIOBJ) hBMObj) + ((HFONT) GDIOBJ_AllocObj (sizeof (TEXTOBJ), GO_FONT_MAGIC)) +#define TEXTOBJ_FreeText(hBMObj) GDIOBJ_FreeObj((HGDIOBJ) hBMObj, GO_FONT_MAGIC) +/* #define TEXTOBJ_HandleToPtr(hBMObj) \ ((PTEXTOBJ) GDIOBJ_HandleToPtr ((HGDIOBJ) hBMObj, GO_FONT_MAGIC)) #define TEXTOBJ_PtrToHandle(hBMObj) \ ((HFONT) GDIOBJ_PtrToHandle ((PGDIOBJ) hBMObj, GO_FONT_MAGIC)) -#define TEXTOBJ_LockText(hBMObj) GDIOBJ_LockObject ((HGDIOBJ) hBMObj) -#define TEXTOBJ_UnlockText(hBMObj) GDIOBJ_UnlockObject ((HGDIOBJ) hBMObj) +*/ +#define TEXTOBJ_LockText(hBMObj) ((PTEXTOBJ) GDIOBJ_LockObj ((HGDIOBJ) hBMObj, GO_FONT_MAGIC)) +#define TEXTOBJ_UnlockText(hBMObj) GDIOBJ_UnlockObj ((HGDIOBJ) hBMObj, GO_FONT_MAGIC) int STDCALL @@ -252,7 +254,7 @@ W32kTextOut(HDC hDC, UINT STDCALL W32kTranslateCharsetInfo(PDWORD Src, - LPCHARSETINFO CSI, + LPCHARSETINFO CSI, DWORD Flags); #endif diff --git a/reactos/lib/gdi32/objects/pen.c b/reactos/lib/gdi32/objects/pen.c index db41cf19868..51286df1213 100644 --- a/reactos/lib/gdi32/objects/pen.c +++ b/reactos/lib/gdi32/objects/pen.c @@ -20,3 +20,10 @@ CreatePenIndirect(CONST LOGPEN *lgpn) { return W32kCreatePenIndirect((CONST PLOGPEN)lgpn); } +/* +VOID STDCALL +DumpGdiObjects( INT process ) +{ + W32kDumpGdiObjects( process ); +} +*/ diff --git a/reactos/subsys/win32k/freetype/grfont.c b/reactos/subsys/win32k/freetype/grfont.c index 365c0b04463..d8e8d41796d 100644 --- a/reactos/subsys/win32k/freetype/grfont.c +++ b/reactos/subsys/win32k/freetype/grfont.c @@ -7,6 +7,9 @@ #include #include "../eng/objects.h" +//#define NDEBUG +#include + // #include "grfont.h" // #include @@ -275,6 +278,8 @@ const unsigned char font_8x8[2048] = static PSURFOBJ CharCellSurfObj; static HBITMAP hCharCellBitmap; +VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap); + // Set things up for a character cell surface void CreateCellCharSurface() { @@ -287,9 +292,10 @@ void CreateCellCharSurface() hCharCellBitmap = W32kCreateBitmap(8, 8, 1, 8, NULL); // 8x8, 1 plane, 8 bits per pel pbo = BITMAPOBJ_HandleToPtr(hCharCellBitmap); - + ASSERT( pbo ); // VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap) BitmapToSurf(0, surfgdi, CharCellSurfObj, pbo); // Make the bitmap a surface + BITMAPOBJ_ReleasePtr( hCharCellBitmap ); } void grWriteCellChar(PSURFOBJ target, diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index fb2687d34fd..fc15d8c6e18 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.c @@ -1,5 +1,5 @@ -/* $Id: dllmain.c,v 1.26 2002/07/04 19:56:37 dwelch Exp $ - * +/* $Id: dllmain.c,v 1.27 2002/07/13 21:37:26 ei Exp $ + * * Entry Point for win32k.sys */ @@ -17,6 +17,9 @@ #include #include +//#define NDEBUG +#include + extern SSDT Win32kSSDT[]; extern SSPT Win32kSSPT[]; extern ULONG Win32kNumberOfSysCalls; @@ -94,6 +97,7 @@ BOOLEAN STDCALL W32kInitialize (VOID) { + DPRINT("in W32kInitialize\n"); InitGdiObjectHandleTable (); // Create surface used to draw the internal font onto diff --git a/reactos/subsys/win32k/objects/bitmaps.c b/reactos/subsys/win32k/objects/bitmaps.c index c0d1859d9e9..b018629ef55 100644 --- a/reactos/subsys/win32k/objects/bitmaps.c +++ b/reactos/subsys/win32k/objects/bitmaps.c @@ -5,8 +5,8 @@ //#include #include "../eng/objects.h" -#define NDEBUG -#include +//#define NDEBUG +#include BOOL STDCALL W32kBitBlt(HDC hDCDest, INT XDest, @@ -85,6 +85,9 @@ BOOL STDCALL W32kBitBlt(HDC hDCDest, if(SurfDestAlloc == TRUE) ExFreePool(SurfDest); if(SurfSrcAlloc == TRUE) ExFreePool(SurfSrc); + DC_ReleasePtr(hDCDest); + DC_ReleasePtr(hDCSrc); + return Status; } @@ -101,31 +104,34 @@ HBITMAP STDCALL W32kCreateBitmap(INT Width, BitsPerPel = (BYTE) BitsPerPel; /* Check parameters */ - if (!Height || !Width) + if (!Height || !Width) { return 0; } - if (Planes != 1) + if (Planes != 1) { UNIMPLEMENTED; return 0; } - if (Height < 0) + if (Height < 0) { Height = -Height; } - if (Width < 0) + if (Width < 0) { Width = -Width; } /* Create the BITMAPOBJ */ - bmp = BITMAPOBJ_AllocBitmap (); - if (!bmp) + hBitmap = BITMAPOBJ_AllocBitmap (); + if (!hBitmap) { + DPRINT("W32kCreateBitmap: BITMAPOBJ_AllocBitmap returned 0\n"); return 0; } + bmp = BITMAPOBJ_HandleToPtr( hBitmap ); + DPRINT("W32kCreateBitmap:%dx%d, %d (%d BPP) colors returning %08x\n", Width, Height, 1 << (Planes * BitsPerPel), BitsPerPel, bmp); @@ -140,7 +146,6 @@ HBITMAP STDCALL W32kCreateBitmap(INT Width, bmp->bitmap.bmBits = NULL; bmp->DDBitmap = NULL; bmp->dib = NULL; - hBitmap = BITMAPOBJ_PtrToHandle (bmp); // Allocate memory for bitmap bits bmp->bitmap.bmBits = ExAllocatePool(PagedPool, bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight); @@ -150,9 +155,19 @@ HBITMAP STDCALL W32kCreateBitmap(INT Width, W32kSetBitmapBits(hBitmap, Height * bmp->bitmap.bmWidthBytes, Bits); } + BITMAPOBJ_ReleasePtr( hBitmap ); + return hBitmap; } +BOOL Bitmap_InternalDelete( PBITMAPOBJ pBmp ) +{ + ASSERT( pBmp ); + ExFreePool(pBmp->bitmap.bmBits); + return TRUE; +} + + HBITMAP STDCALL W32kCreateCompatibleBitmap(HDC hDC, INT Width, INT Height) @@ -169,33 +184,33 @@ HBITMAP STDCALL W32kCreateCompatibleBitmap(HDC hDC, { return 0; } - if ((Width >= 0x10000) || (Height >= 0x10000)) + if ((Width >= 0x10000) || (Height >= 0x10000)) { DPRINT("got bad width %d or height %d, please look for reason\n", Width, Height); } - else + else { /* MS doc says if width or height is 0, return 1-by-1 pixel, monochrome bitmap */ if (!Width || !Height) { hbmpRet = W32kCreateBitmap (1, 1, 1, 1, NULL); } - else + else { hbmpRet = W32kCreateBitmap(Width, Height, 1, dc->w.bitsPerPixel, NULL); } } DPRINT ("\t\t%04x\n", hbmpRet); - + DC_ReleasePtr( hDC ); return hbmpRet; } HBITMAP STDCALL W32kCreateBitmapIndirect(CONST BITMAP *BM) { - return W32kCreateBitmap (BM->bmWidth, - BM->bmHeight, + return W32kCreateBitmap (BM->bmWidth, + BM->bmHeight, BM->bmPlanes, - BM->bmBitsPixel, + BM->bmBitsPixel, BM->bmBits); } @@ -210,7 +225,7 @@ HBITMAP STDCALL W32kCreateDiscardableBitmap(HDC hDC, BOOL STDCALL W32kExtFloodFill(HDC hDC, INT XStart, INT YStart, - COLORREF Color, + COLORREF Color, UINT FillType) { UNIMPLEMENTED; @@ -228,13 +243,13 @@ BOOL STDCALL W32kGetBitmapDimensionEx(HBITMAP hBitmap, LPSIZE Dimension) { PBITMAPOBJ bmp; - + bmp = BITMAPOBJ_HandleToPtr (hBitmap); - if (bmp == NULL) + if (bmp == NULL) { return FALSE; } - + *Dimension = bmp->size; return TRUE; @@ -253,7 +268,7 @@ BOOL STDCALL W32kMaskBlt(HDC hDCDest, INT Width, INT Height, HDC hDCSrc, - INT XSrc, + INT XSrc, INT YSrc, HBITMAP hMaskBitmap, INT xMask, @@ -265,13 +280,13 @@ BOOL STDCALL W32kMaskBlt(HDC hDCDest, BOOL STDCALL W32kPlgBlt(HDC hDCDest, CONST POINT *Point, - HDC hDCSrc, - INT XSrc, - INT YSrc, - INT Width, + HDC hDCSrc, + INT XSrc, + INT YSrc, + INT Width, INT Height, HBITMAP hMaskBitmap, - INT xMask, + INT xMask, INT yMask) { UNIMPLEMENTED; @@ -283,14 +298,14 @@ LONG STDCALL W32kSetBitmapBits(HBITMAP hBitmap, { DWORD height, ret; PBITMAPOBJ bmp; - + bmp = BITMAPOBJ_HandleToPtr (hBitmap); if (bmp == NULL || Bits == NULL) { return 0; } - if (Bytes < 0) + if (Bytes < 0) { DPRINT ("(%ld): Negative number of bytes passed???\n", Bytes ); Bytes = -Bytes; @@ -298,35 +313,35 @@ LONG STDCALL W32kSetBitmapBits(HBITMAP hBitmap, /* Only get entire lines */ height = Bytes / bmp->bitmap.bmWidthBytes; - if (height > bmp->bitmap.bmHeight) + if (height > bmp->bitmap.bmHeight) { height = bmp->bitmap.bmHeight; } Bytes = height * bmp->bitmap.bmWidthBytes; DPRINT ("(%08x, bytes:%ld, bits:%p) %dx%d %d colors fetched height: %ld\n", - hBitmap, - Bytes, - Bits, - bmp->bitmap.bmWidth, + hBitmap, + Bytes, + Bits, + bmp->bitmap.bmWidth, bmp->bitmap.bmHeight, - 1 << bmp->bitmap.bmBitsPixel, + 1 << bmp->bitmap.bmBitsPixel, height); #if 0 /* FIXME: call DDI specific function here if available */ - if(bmp->DDBitmap) + if(bmp->DDBitmap) { DPRINT ("Calling device specific BitmapBits\n"); if (bmp->DDBitmap->funcs->pBitmapBits) { ret = bmp->DDBitmap->funcs->pBitmapBits(hBitmap, (void *) Bits, Bytes, DDB_SET); - } - else + } + else { DPRINT ("BitmapBits == NULL??\n"); ret = 0; } - } + } else #endif { @@ -335,12 +350,12 @@ LONG STDCALL W32kSetBitmapBits(HBITMAP hBitmap, { bmp->bitmap.bmBits = ExAllocatePool (PagedPool, Bytes); } - if(!bmp->bitmap.bmBits) + if(!bmp->bitmap.bmBits) { DPRINT ("Unable to allocate bit buffer\n"); ret = 0; - } - else + } + else { memcpy(bmp->bitmap.bmBits, Bits, Bytes); ret = Bytes; @@ -356,14 +371,14 @@ BOOL STDCALL W32kSetBitmapDimensionEx(HBITMAP hBitmap, LPSIZE Size) { PBITMAPOBJ bmp; - + bmp = BITMAPOBJ_HandleToPtr (hBitmap); - if (bmp == NULL) + if (bmp == NULL) { return FALSE; } - - if (Size) + + if (Size) { *Size = bmp->size; } @@ -397,8 +412,8 @@ BOOL STDCALL W32kStretchBlt(HDC hDCDest, HDC hDCSrc, INT XOriginSrc, INT YOriginSrc, - INT WidthSrc, - INT HeightSrc, + INT WidthSrc, + INT HeightSrc, DWORD ROP) { UNIMPLEMENTED; @@ -406,29 +421,29 @@ BOOL STDCALL W32kStretchBlt(HDC hDCDest, /* Internal Functions */ -INT +INT BITMAPOBJ_GetWidthBytes (INT bmWidth, INT bpp) { switch(bpp) { case 1: return 2 * ((bmWidth+15) >> 4); - + case 24: bmWidth *= 3; /* fall through */ case 8: return bmWidth + (bmWidth & 1); - + case 32: return bmWidth * 4; - + case 16: case 15: return bmWidth * 2; case 4: return 2 * ((bmWidth+3) >> 2); - + default: DPRINT ("stub"); } @@ -443,19 +458,19 @@ HBITMAP BITMAPOBJ_CopyBitmap(HBITMAP hBitmap) BITMAP bm; bmp = BITMAPOBJ_HandleToPtr (hBitmap); - if (bmp == NULL) + if (bmp == NULL) { return 0; } res = 0; - + bm = bmp->bitmap; bm.bmBits = NULL; res = W32kCreateBitmapIndirect(&bm); - if(res) + if(res) { char *buf; - + buf = ExAllocatePool (NonPagedPool, bm.bmWidthBytes * bm.bmHeight); W32kGetBitmapBits (hBitmap, bm.bmWidthBytes * bm.bmHeight, buf); W32kSetBitmapBits (res, bm.bmWidthBytes * bm.bmHeight, buf); diff --git a/reactos/subsys/win32k/objects/brush.c b/reactos/subsys/win32k/objects/brush.c index 9eb392bb824..311828bbd36 100644 --- a/reactos/subsys/win32k/objects/brush.c +++ b/reactos/subsys/win32k/objects/brush.c @@ -1,4 +1,4 @@ -/* $Id: brush.c,v 1.13 2001/11/02 06:10:11 rex Exp $ +/* $Id: brush.c,v 1.14 2002/07/13 21:37:26 ei Exp $ */ @@ -17,20 +17,25 @@ HBRUSH STDCALL W32kCreateBrushIndirect(CONST LOGBRUSH *lb) PBRUSHOBJ brushPtr; HBRUSH hBrush; - brushPtr = BRUSHOBJ_AllocBrush(); - hBrush = BRUSHOBJ_PtrToHandle (brushPtr); - + hBrush = BRUSHOBJ_AllocBrush(); if (hBrush == NULL) { return 0; } - brushPtr->iSolidColor = lb->lbColor; - brushPtr->logbrush.lbStyle = lb->lbStyle; - brushPtr->logbrush.lbColor = lb->lbColor; - brushPtr->logbrush.lbHatch = lb->lbHatch; + brushPtr = BRUSHOBJ_LockBrush (hBrush); + ASSERT( brushPtr ); //I want to know if this ever occurs - return hBrush; + if( brushPtr ){ + brushPtr->iSolidColor = lb->lbColor; + brushPtr->logbrush.lbStyle = lb->lbStyle; + brushPtr->logbrush.lbColor = lb->lbColor; + brushPtr->logbrush.lbHatch = lb->lbHatch; + + BRUSHOBJ_UnlockBrush( hBrush ); + return hBrush; + } + return NULL; } HBRUSH STDCALL W32kCreateDIBPatternBrush(HGLOBAL hDIBPacked, @@ -41,7 +46,7 @@ HBRUSH STDCALL W32kCreateDIBPatternBrush(HGLOBAL hDIBPacked, LOGBRUSH logbrush; PBITMAPINFO info, newInfo; INT size; - + DPRINT("%04x\n", hbitmap ); logbrush.lbStyle = BS_DIBPATTERN; @@ -49,11 +54,11 @@ HBRUSH STDCALL W32kCreateDIBPatternBrush(HGLOBAL hDIBPacked, logbrush.lbHatch = 0; /* Make a copy of the bitmap */ - if (!(info = (BITMAPINFO *)GlobalLock( hbitmap ))) + if (!(info = (BITMAPINFO *)GlobalLock( hbitmap ))) { return 0; } - + if (info->bmiHeader.biCompression) size = info->bmiHeader.biSizeImage; else @@ -80,16 +85,16 @@ HBRUSH STDCALL W32kCreateDIBPatternBrushPt(CONST VOID *PackedDIB, LOGBRUSH logbrush; PBITMAPINFO info; PBITMAPINFO newInfo; - + info = (BITMAPINFO *) PackedDIB; if (info == NULL) { return 0; } - DPRINT ("%p %ldx%ld %dbpp\n", - info, + DPRINT ("%p %ldx%ld %dbpp\n", + info, info->bmiHeader.biWidth, - info->bmiHeader.biHeight, + info->bmiHeader.biHeight, info->bmiHeader.biBitCount); logbrush.lbStyle = BS_DIBPATTERN; @@ -107,15 +112,17 @@ HBRUSH STDCALL W32kCreateDIBPatternBrushPt(CONST VOID *PackedDIB, size = DIB_GetDIBImageBytes (info->bmiHeader.biWidth, info->bmiHeader.biHeight, info->bmiHeader.biBitCount); } size += DIB_BitmapInfoSize (info, Usage); - - logbrush.lbHatch = (INT)GDIOBJ_PtrToHandle (GDIOBJ_AllocObject (size, GO_MAGIC_DONTCARE), GO_MAGIC_DONTCARE); + + logbrush.lbHatch = (LONG) GDIOBJ_AllocObj(size, GO_MAGIC_DONTCARE); if (logbrush.lbHatch == 0) { return 0; } - newInfo = (PBITMAPINFO) GDIOBJ_HandleToPtr ((HGDIOBJ) logbrush.lbHatch, GO_MAGIC_DONTCARE); + newInfo = (PBITMAPINFO) GDIOBJ_LockObj ((HGDIOBJ) logbrush.lbHatch, GO_MAGIC_DONTCARE); + ASSERT(newInfo); memcpy(newInfo, info, size); - + GDIOBJ_UnlockObj( (HGDIOBJ) logbrush.lbHatch, GO_MAGIC_DONTCARE ); + return W32kCreateBrushIndirect (&logbrush); } @@ -133,7 +140,7 @@ HBRUSH STDCALL W32kCreateHatchBrush(INT Style, logbrush.lbStyle = BS_HATCHED; logbrush.lbColor = Color; logbrush.lbHatch = Style; - + return W32kCreateBrushIndirect (&logbrush); } diff --git a/reactos/subsys/win32k/objects/cliprgn.c b/reactos/subsys/win32k/objects/cliprgn.c index ef46d3a3246..9ca5834bf26 100644 --- a/reactos/subsys/win32k/objects/cliprgn.c +++ b/reactos/subsys/win32k/objects/cliprgn.c @@ -3,11 +3,56 @@ #undef WIN32_LEAN_AND_MEAN #include #include +#include #include // #define NDEBUG #include +HRGN WINAPI SaveVisRgn(HDC hdc) +{ + HRGN copy; + PRGNDATA obj, copyObj; + PDC dc = DC_HandleToPtr(hdc); +/*ei + if (!dc) return 0; + + obj = RGNDATA_HandleToPtr(dc->w.hVisRgn); + + if(!(copy = CreateRectRgn(0, 0, 0, 0))) + { + GDI_ReleaseObj(dc->w.hVisRgn); + GDI_ReleaseObj(hdc); + return 0; + } + CombineRgn(copy, dc->w.hVisRgn, 0, RGN_COPY); + copyObj = RGNDATA_HandleToPtr(copy); +*/ +/* copyObj->header.hNext = obj->header.hNext; + header.hNext = copy; */ + DC_ReleasePtr( hdc ); + return copy; +} + +INT16 WINAPI SelectVisRgn(HDC hdc, HRGN hrgn) +{ + return ERROR; +/*ei + int retval; + DC *dc; + + if (!hrgn) return ERROR; + if (!(dc = DC_HandleToPtr(hdc))) return ERROR; + + dc->flags &= ~DC_DIRTY; + + retval = CombineRgn(dc->hVisRgn, hrgn, 0, RGN_COPY); + CLIPPING_UpdateGCRegion(dc); + + return retval; +*/ +} + int STDCALL W32kExcludeClipRect(HDC hDC, int LeftRect, int TopRect, diff --git a/reactos/subsys/win32k/objects/color.c b/reactos/subsys/win32k/objects/color.c index 157b70936b7..9e05b19edc5 100644 --- a/reactos/subsys/win32k/objects/color.c +++ b/reactos/subsys/win32k/objects/color.c @@ -19,7 +19,7 @@ int COLOR_max = 256; static HPALETTE hPrimaryPalette = 0; // used for WM_PALETTECHANGED static HPALETTE hLastRealizedPalette = 0; // UnrealizeObject() needs it -const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] = +const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] = { // first 10 entries in the system palette // red green blue flags @@ -50,6 +50,10 @@ const PALETTEENTRY COLOR_sysPalTemplate[NB_RESERVED_COLORS] = { 0xff, 0xff, 0xff, PC_SYS_USED } // last 10 }; +//forward declarations +COLORREF COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF color ); + + const PALETTEENTRY* COLOR_GetSystemPaletteTemplate(void) { return (const PALETTEENTRY*)&COLOR_sysPalTemplate; @@ -102,7 +106,7 @@ HPALETTE STDCALL W32kCreateHalftonePalette(HDC hDC) Palette.aEntries[i].peRed = r * 51; Palette.aEntries[i].peGreen = g * 51; Palette.aEntries[i].peBlue = b * 51; - } + } } } @@ -120,7 +124,7 @@ HPALETTE STDCALL W32kCreatePalette(CONST PLOGPALETTE palette) { PPALOBJ PalObj; - HPALETTE NewPalette = (HPALETTE)EngCreatePalette(PAL_INDEXED, palette->palNumEntries, palette->palPalEntry, 0, 0, 0); + HPALETTE NewPalette = (HPALETTE)EngCreatePalette(PAL_INDEXED, palette->palNumEntries, (PULONG*) palette->palPalEntry, 0, 0, 0); ULONG size; PalObj = (PPALOBJ)AccessUserObject(NewPalette); @@ -147,7 +151,7 @@ COLORREF STDCALL W32kGetNearestColor(HDC hDC, PDC dc; PPALOBJ palObj; - if(DC_HandleToPtr(hDC)) + if( (dc = DC_HandleToPtr(hDC) ) ) { HPALETTE hpal = (dc->w.hPalette)? dc->w.hPalette : W32kGetStockObject(DEFAULT_PALETTE); palObj = (PPALOBJ)AccessUserObject(hpal); @@ -158,9 +162,9 @@ COLORREF STDCALL W32kGetNearestColor(HDC hDC, nearest = COLOR_LookupNearestColor(palObj->logpalette->palPalEntry, palObj->logpalette->palNumEntries, Color); - + // FIXME: release hpal!! // GDI_ReleaseObj( hpal ); -// GDI_ReleaseObj( hdc ); + DC_ReleasePtr( hDC ); } return nearest; @@ -196,8 +200,8 @@ UINT STDCALL W32kGetPaletteEntries(HPALETTE hpal, numEntries = palPtr->logpalette->palNumEntries; if (StartIndex + Entries > numEntries) Entries = numEntries - StartIndex; if (pe) - { - if (StartIndex >= numEntries) + { + if (StartIndex >= numEntries) { // GDI_ReleaseObj( hpalette ); return 0; @@ -253,7 +257,7 @@ UINT STDCALL W32kGetSystemPaletteUse(HDC hDC) UINT STDCALL W32kRealizePalette(HDC hDC) /* -The RealizePalette function modifies the palette for the device associated with the specified device context. If the device context is a memory DC, the color table for the bitmap selected into the DC is modified. If the device context is a display DC, the physical palette for that device is modified. +The RealizePalette function modifies the palette for the device associated with the specified device context. If the device context is a memory DC, the color table for the bitmap selected into the DC is modified. If the device context is a display DC, the physical palette for that device is modified. A logical palette is a buffer between color-intensive applications and the system, allowing these applications to use as many colors as needed without interfering with colors displayed by other windows. @@ -332,13 +336,13 @@ BOOL STDCALL W32kResizePalette(HPALETTE hpal, prevsize = sizeof(LOGPALETTE) + (cPrevEnt - 1) * sizeof(PALETTEENTRY) + sizeof(int*) + sizeof(GDIOBJHDR); size += sizeof(int*) + sizeof(GDIOBJHDR); XlateObj = palPtr->logicalToSystem; - + if (!(palPtr = GDI_ReallocObject(size, hPal, palPtr))) return FALSE; if(XlateObj) { PXLATEOBJ NewXlateObj = (int*) HeapReAlloc(GetProcessHeap(), 0, XlateObj, cEntries * sizeof(int)); - if(NewXlateObj == NULL) + if(NewXlateObj == NULL) { ERR("Can not resize logicalToSystem -- out of memory!"); GDI_ReleaseObj( hPal ); @@ -475,7 +479,7 @@ COLORREF COLOR_LookupNearestColor( PALETTEENTRY* palPalEntry, int size, COLORREF else if( spec_type == 1 ) /* PALETTEINDEX */ { - if( (i = color & 0x0000ffff) >= size ) + if( (i = color & 0x0000ffff) >= size ) { DbgPrint("RGB(%lx) : idx %d is out of bounds, assuming NULL\n", color, i); color = *(COLORREF*)palPalEntry; diff --git a/reactos/subsys/win32k/objects/coord.c b/reactos/subsys/win32k/objects/coord.c index 0aaa61f3c8a..138294cb5c5 100644 --- a/reactos/subsys/win32k/objects/coord.c +++ b/reactos/subsys/win32k/objects/coord.c @@ -1,4 +1,4 @@ -/* $Id: coord.c,v 1.7 2002/07/04 19:56:37 dwelch Exp $ +/* $Id: coord.c,v 1.8 2002/07/13 21:37:26 ei Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -24,7 +24,7 @@ BOOL STDCALL W32kCombineTransform(LPXFORM XFormResult, CONST LPXFORM xform2) { XFORM xformTemp; - + /* Check for illegal parameters */ if (!XFormResult || !xform1 || !xform2) { @@ -47,34 +47,35 @@ BOOL STDCALL W32kCombineTransform(LPXFORM XFormResult, VOID STATIC CoordDPtoLP(PDC Dc, LPPOINT Point) -{ +{ FLOAT x, y; x = (FLOAT)Point->x; y = (FLOAT)Point->y; Point->x = x * Dc->w.xformVport2World.eM11 + y * Dc->w.xformVport2World.eM21 + Dc->w.xformVport2World.eDx; Point->y = x * Dc->w.xformVport2World.eM12 + - y * Dc->w.xformVport2World.eM22 + Dc->w.xformVport2World.eDy; + y * Dc->w.xformVport2World.eM22 + Dc->w.xformVport2World.eDy; } -BOOL STDCALL +BOOL STDCALL W32kDPtoLP(HDC hDC, LPPOINT Points, int Count) { - PDC Dc; + PDC Dc; ULONG i; - + Dc = DC_HandleToPtr (hDC); - if (Dc == NULL || !Dc->w.vport2WorldValid) + if (Dc == NULL || !Dc->w.vport2WorldValid) { return(FALSE); } - + for (i = 0; i < Count; i++) { CoordDPtoLP(Dc, &Points[i]); } + DC_ReleasePtr( hDC ); return(TRUE); } @@ -84,15 +85,15 @@ W32kGetGraphicsMode(HDC hDC) { PDC dc; int GraphicsMode; - + dc = DC_HandleToPtr (hDC); - if (!dc) + if (!dc) { return 0; } - + GraphicsMode = dc->w.GraphicsMode; - + DC_ReleasePtr( hDC ); return GraphicsMode; } @@ -102,7 +103,7 @@ W32kGetWorldTransform(HDC hDC, LPXFORM XForm) { PDC dc; - + dc = DC_HandleToPtr (hDC); if (!dc) { @@ -113,7 +114,7 @@ W32kGetWorldTransform(HDC hDC, return FALSE; } *XForm = dc->w.xformWorld2Wnd; - + DC_ReleasePtr( hDC ); return TRUE; } @@ -132,19 +133,20 @@ CoordLPtoDP(PDC Dc, LPPOINT Point) BOOL STDCALL W32kLPtoDP(HDC hDC, LPPOINT Points, INT Count) { - PDC Dc; + PDC Dc; ULONG i; - + Dc = DC_HandleToPtr (hDC); - if (Dc == NULL) + if (Dc == NULL) { return(FALSE); } - + for (i = 0; i < Count; i++) { CoordLPtoDP(Dc, &Points[i]); } + DC_ReleasePtr( hDC ); return(TRUE); } @@ -155,7 +157,7 @@ W32kModifyWorldTransform(HDC hDC, DWORD Mode) { PDC dc; - + dc = DC_HandleToPtr (hDC); if (!dc) { @@ -166,7 +168,7 @@ W32kModifyWorldTransform(HDC hDC, { return FALSE; } - + /* Check that graphics mode is GM_ADVANCED */ if (dc->w.GraphicsMode!=GM_ADVANCED) { @@ -178,24 +180,25 @@ W32kModifyWorldTransform(HDC hDC, dc->w.xformWorld2Wnd.eM11 = 1.0f; dc->w.xformWorld2Wnd.eM12 = 0.0f; dc->w.xformWorld2Wnd.eM21 = 0.0f; - dc->w.xformWorld2Wnd.eM22 = 1.0f; + dc->w.xformWorld2Wnd.eM22 = 1.0f; dc->w.xformWorld2Wnd.eDx = 0.0f; dc->w.xformWorld2Wnd.eDy = 0.0f; break; - + case MWT_LEFTMULTIPLY: W32kCombineTransform(&dc->w.xformWorld2Wnd, XForm, &dc->w.xformWorld2Wnd ); break; - + case MWT_RIGHTMULTIPLY: W32kCombineTransform(&dc->w.xformWorld2Wnd, &dc->w.xformWorld2Wnd, XForm); break; - + default: + DC_ReleasePtr( hDC ); return FALSE; } DC_UpdateXforms (dc); - + DC_ReleasePtr( hDC ); return TRUE; } @@ -250,7 +253,7 @@ W32kSetGraphicsMode(HDC hDC, { INT ret; DC *dc; - + dc = DC_HandleToPtr (hDC); if (!dc) { @@ -262,14 +265,15 @@ W32kSetGraphicsMode(HDC hDC, * matrix. However, in Windows, this is not the case. This doesn't * make a lot of sense to me, but that's the way it is. */ - - if ((Mode != GM_COMPATIBLE) && (Mode != GM_ADVANCED)) + + if ((Mode != GM_COMPATIBLE) && (Mode != GM_ADVANCED)) { + DC_ReleasePtr( hDC ); return 0; } ret = dc->w.GraphicsMode; dc->w.GraphicsMode = Mode; - + DC_ReleasePtr( hDC ); return ret; } @@ -327,26 +331,27 @@ W32kSetWorldTransform(HDC hDC, CONST LPXFORM XForm) { PDC dc; - + dc = DC_HandleToPtr (hDC); if (!dc) { -// SetLastError( ERROR_INVALID_HANDLE ); return FALSE; } if (!XForm) { + DC_ReleasePtr( hDC ); return FALSE; } - + /* Check that graphics mode is GM_ADVANCED */ if (dc->w.GraphicsMode != GM_ADVANCED) { + DC_ReleasePtr( hDC ); return FALSE; } dc->w.xformWorld2Wnd = *XForm; DC_UpdateXforms (dc); - + DC_ReleasePtr( hDC ); return TRUE; } diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index e9bf702741a..cec4c715f92 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -1,7 +1,7 @@ -/* $Id: dc.c,v 1.31 2002/02/16 00:51:02 jfilby Exp $ +/* $Id: dc.c,v 1.32 2002/07/13 21:37:26 ei Exp $ * * DC.C - Device context functions - * + * */ #undef WIN32_LEAN_AND_MEAN @@ -19,9 +19,10 @@ #include #include "../eng/objects.h" -#define NDEBUG +//#define NDEBUG #include + /* FIXME: DCs should probably be thread safe */ /* @@ -39,11 +40,12 @@ func_type STDCALL func_name( HDC hdc ) \ return 0; \ } \ ft = dc->dc_field; \ + DC_ReleasePtr( hdc ); \ return ft; \ } -/* DC_GET_VAL_EX is used to define functions returning a POINT or a SIZE. It is - * important that the function has the right signature, for the implementation +/* DC_GET_VAL_EX is used to define functions returning a POINT or a SIZE. It is + * important that the function has the right signature, for the implementation * we can do whatever we want. */ #define DC_GET_VAL_EX( func_name, ret_x, ret_y, type ) \ @@ -56,6 +58,7 @@ BOOL STDCALL func_name( HDC hdc, LP##type pt ) \ } \ ((LPPOINT)pt)->x = dc->ret_x; \ ((LPPOINT)pt)->y = dc->ret_y; \ + DC_ReleasePtr( hdc ); \ return TRUE; \ } @@ -74,9 +77,12 @@ INT STDCALL func_name( HDC hdc, INT mode ) \ } \ prevMode = dc->dc_field; \ dc->dc_field = mode; \ + DC_ReleasePtr( hdc ); \ return prevMode; \ } +VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap); + // --------------------------------------------------------- File Statics static void W32kSetDCState16(HDC hDC, HDC hDCSave); @@ -93,17 +99,23 @@ HDC STDCALL W32kCreateCompatableDC(HDC hDC) PDC NewDC, OrigDC = NULL; HBITMAP hBitmap; SIZEL onebyone; + HDC hNewDC; OrigDC = DC_HandleToPtr(hDC); if (OrigDC == NULL) { - NewDC = DC_AllocDC(L"DISPLAY"); - } else { + hNewDC = DC_AllocDC(L"DISPLAY"); + if( hNewDC ) + NewDC = DC_HandleToPtr( hNewDC ); + } + else { /* Allocate a new DC based on the original DC's device */ - NewDC = DC_AllocDC(OrigDC->DriverName); + hNewDC = DC_AllocDC(OrigDC->DriverName); + if( hNewDC ) + NewDC = DC_HandleToPtr( hNewDC ); } - if (NewDC == NULL) + if (NewDC == NULL) { return NULL; } @@ -116,7 +128,7 @@ HDC STDCALL W32kCreateCompatableDC(HDC hDC) } else { NewDC->PDev = OrigDC->PDev; NewDC->DMW = OrigDC->DMW; - memcpy(NewDC->FillPatternSurfaces, + memcpy(NewDC->FillPatternSurfaces, OrigDC->FillPatternSurfaces, sizeof OrigDC->FillPatternSurfaces); NewDC->GDIInfo = OrigDC->GDIInfo; @@ -143,13 +155,13 @@ HDC STDCALL W32kCreateCompatableDC(HDC hDC) NewDC->vportExtY = OrigDC->vportExtY; } - DC_InitDC(NewDC); + DC_InitDC(hNewDC); /* Create default bitmap */ if (!(hBitmap = W32kCreateBitmap( 1, 1, 1, 1, NULL ))) { - DC_FreeDC(NewDC); - + DC_ReleasePtr( hNewDC ); + DC_FreeDC( hNewDC ); return NULL; } NewDC->w.flags = DC_MEMORY; @@ -163,8 +175,10 @@ HDC STDCALL W32kCreateCompatableDC(HDC hDC) NewDC->w.textColor = OrigDC->w.textColor; NewDC->w.textAlign = OrigDC->w.textAlign; } + DC_ReleasePtr( hDC ); + DC_ReleasePtr( hNewDC ); - return DC_PtrToHandle(NewDC); + return hNewDC; } #include @@ -175,27 +189,30 @@ HDC STDCALL W32kCreateDC(LPCWSTR Driver, CONST PDEVMODEW InitData) { PGD_ENABLEDRIVER GDEnableDriver; + HDC hNewDC; PDC NewDC; HDC hDC = NULL; DRVENABLEDATA DED; - HDC hNewDC; PSURFOBJ SurfObj; /* Check for existing DC object */ - if ((NewDC = DC_FindOpenDC(Driver)) != NULL) + if ((hNewDC = DC_FindOpenDC(Driver)) != NULL) { - hDC = DC_PtrToHandle(NewDC); + hDC = hNewDC; return W32kCreateCompatableDC(hDC); } DPRINT("NAME: %S\n", Driver); // FIXME: Should not crash if NULL /* Allocate a DC object */ - if ((NewDC = DC_AllocDC(Driver)) == NULL) + if ((hNewDC = DC_AllocDC(Driver)) == NULL) { return NULL; } + NewDC = DC_HandleToPtr( hNewDC ); + ASSERT( NewDC ); + /* Open the miniport driver */ if ((NewDC->DeviceDriver = DRIVER_FindMPDriver(Driver)) == NULL) { @@ -238,7 +255,7 @@ HDC STDCALL W32kCreateDC(LPCWSTR Driver, NewDC->DMW.dmFields = 0x000fc000; /* FIXME: get mode selection information from somewhere */ - + NewDC->DMW.dmLogPixels = 96; NewDC->DMW.dmBitsPerPel = 4; NewDC->DMW.dmPelsWidth = 640; @@ -288,16 +305,16 @@ HDC STDCALL W32kCreateDC(LPCWSTR Driver, DPRINT("Bits per pel: %u\n", NewDC->w.bitsPerPixel); /* Initialize the DC state */ - DC_InitDC(NewDC); - hNewDC = DC_PtrToHandle(NewDC); + DC_InitDC(hNewDC); W32kSetTextColor(hNewDC, RGB(0xff, 0xff, 0xff)); W32kSetTextAlign(hNewDC, TA_BASELINE); - + DC_ReleasePtr( hNewDC ); return hNewDC; Failure: - DC_FreeDC(NewDC); + DC_ReleasePtr( hNewDC ); + DC_FreeDC(hNewDC); return NULL; } @@ -313,7 +330,7 @@ HDC STDCALL W32kCreateIC(LPCWSTR Driver, BOOL STDCALL W32kDeleteDC(HDC DCHandle) { PDC DCToDelete; - + DCToDelete = DC_HandleToPtr(DCHandle); if (DCToDelete == NULL) { @@ -338,7 +355,7 @@ BOOL STDCALL W32kDeleteDC(HDC DCHandle) { PDC savedDC; HDC savedHDC; - + savedHDC = DC_GetNextDC (DCToDelete); savedDC = DC_HandleToPtr (savedHDC); if (savedDC == NULL) @@ -347,9 +364,10 @@ BOOL STDCALL W32kDeleteDC(HDC DCHandle) } DC_SetNextDC (DCToDelete, DC_GetNextDC (savedDC)); DCToDelete->saveLevel--; + DC_ReleasePtr( savedHDC ); W32kDeleteDC (savedHDC); } - + /* Free GDI resources allocated to this DC */ if (!(DCToDelete->w.flags & DC_SAVED)) { @@ -357,57 +375,30 @@ BOOL STDCALL W32kDeleteDC(HDC DCHandle) W32kSelectObject (DCHandle, STOCK_BLACK_PEN); W32kSelectObject (DCHandle, STOCK_WHITE_BRUSH); W32kSelectObject (DCHandle, STOCK_SYSTEM_FONT); - DC_LockDC (DCHandle); W32kSelectObject does not recognize stock objects yet */ - if (DCToDelete->w.flags & DC_MEMORY) + DC_LockDC (DCHandle); W32kSelectObject does not recognize stock objects yet */ + if (DCToDelete->w.flags & DC_MEMORY) { W32kDeleteObject (DCToDelete->w.hFirstBitmap); } } - if (DCToDelete->w.hClipRgn) + if (DCToDelete->w.hClipRgn) { W32kDeleteObject (DCToDelete->w.hClipRgn); } - if (DCToDelete->w.hVisRgn) + if (DCToDelete->w.hVisRgn) { W32kDeleteObject (DCToDelete->w.hVisRgn); } - if (DCToDelete->w.hGCClipRgn) + if (DCToDelete->w.hGCClipRgn) { W32kDeleteObject (DCToDelete->w.hGCClipRgn); } #if 0 /* FIXME */ PATH_DestroyGdiPath (&DCToDelete->w.path); #endif - + DC_ReleasePtr( DCToDelete ); DC_FreeDC (DCToDelete); - - return TRUE; -} -BOOL STDCALL W32kDeleteObject(HGDIOBJ hObject) -{ - 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; } @@ -443,54 +434,58 @@ DC_GET_VAL_EX( W32kGetCurrentPositionEx, w.CursPosX, w.CursPosY, POINT ) BOOL STDCALL W32kGetDCOrgEx(HDC hDC, LPPOINT Point) { - DC * dc; + PDC dc; - if (!Point) + if (!Point) { return FALSE; } dc = DC_HandleToPtr(hDC); - if (dc == NULL) + if (dc == NULL) { return FALSE; } Point->x = Point->y = 0; - Point->x += dc->w.DCOrgX; + Point->x += dc->w.DCOrgX; Point->y += dc->w.DCOrgY; - + DC_ReleasePtr( hDC ); return TRUE; } HDC STDCALL W32kGetDCState16(HDC hDC) { PDC newdc, dc; - + HDC hnewdc; + dc = DC_HandleToPtr(hDC); - if (dc == NULL) + if (dc == NULL) { return 0; } - - newdc = DC_AllocDC(NULL); - if (newdc == NULL) + + hnewdc = DC_AllocDC(NULL); + if (hnewdc == NULL) { + DC_ReleasePtr( hDC ); return 0; } + newdc = DC_HandleToPtr( hnewdc ); + ASSERT( newdc ); newdc->w.flags = dc->w.flags | DC_SAVED; #if 0 newdc->w.devCaps = dc->w.devCaps; #endif - newdc->w.hPen = dc->w.hPen; - newdc->w.hBrush = dc->w.hBrush; - newdc->w.hFont = dc->w.hFont; - newdc->w.hBitmap = dc->w.hBitmap; + newdc->w.hPen = dc->w.hPen; + newdc->w.hBrush = dc->w.hBrush; + newdc->w.hFont = dc->w.hFont; + newdc->w.hBitmap = dc->w.hBitmap; newdc->w.hFirstBitmap = dc->w.hFirstBitmap; #if 0 newdc->w.hDevice = dc->w.hDevice; - newdc->w.hPalette = dc->w.hPalette; + newdc->w.hPalette = dc->w.hPalette; #endif newdc->w.totalExtent = dc->w.totalExtent; newdc->w.bitsPerPixel = dc->w.bitsPerPixel; @@ -534,7 +529,7 @@ HDC STDCALL W32kGetDCState16(HDC hDC) newdc->vportExtX = dc->vportExtX; newdc->vportExtY = dc->vportExtY; - newdc->hSelf = DC_PtrToHandle(newdc); + newdc->hSelf = hnewdc; newdc->saveLevel = 0; #if 0 @@ -555,8 +550,8 @@ HDC STDCALL W32kGetDCState16(HDC hDC) { newdc->w.hClipRgn = 0; } - - return newdc->hSelf; + DC_ReleasePtr( hnewdc ); + return hnewdc; } INT STDCALL W32kGetDeviceCaps(HDC hDC, @@ -565,9 +560,9 @@ INT STDCALL W32kGetDeviceCaps(HDC hDC, PDC dc; INT ret; POINT pt; - + dc = DC_HandleToPtr(hDC); - if (dc == NULL) + if (dc == NULL) { return 0; } @@ -581,35 +576,35 @@ INT STDCALL W32kGetDeviceCaps(HDC hDC, return pt.x; } break; - + case PHYSICALHEIGHT: if(W32kEscape(hDC, GETPHYSPAGESIZE, 0, NULL, (LPVOID)&pt) > 0) { return pt.y; } break; - + case PHYSICALOFFSETX: if(W32kEscape(hDC, GETPRINTINGOFFSET, 0, NULL, (LPVOID)&pt) > 0) { return pt.x; } break; - + case PHYSICALOFFSETY: if(W32kEscape(hDC, GETPRINTINGOFFSET, 0, NULL, (LPVOID)&pt) > 0) { return pt.y; } break; - + case SCALINGFACTORX: if(W32kEscape(hDC, GETSCALINGFACTOR, 0, NULL, (LPVOID)&pt) > 0) { return pt.x; } break; - + case SCALINGFACTORY: if(W32kEscape(hDC, GETSCALINGFACTOR, 0, NULL, (LPVOID)&pt) > 0) { @@ -622,11 +617,12 @@ INT STDCALL W32kGetDeviceCaps(HDC hDC, { return 0; } - + DPRINT("(%04x,%d): returning %d\n", hDC, Index, *(WORD *)(((char *)dc->w.devCaps) + Index)); ret = *(WORD *)(((char *)dc->w.devCaps) + Index); + DC_ReleasePtr( hDC ); return ret; } @@ -639,10 +635,10 @@ INT STDCALL W32kGetObjectA(HANDLE handle, INT count, LPVOID buffer) INT result = 0; WORD magic; - if (!count) + if (!count) return 0; - gdiObject = GDIOBJ_HandleToPtr (handle, GO_MAGIC_DONTCARE); - if (gdiObject == 0) + gdiObject = GDIOBJ_LockObj (handle, GO_MAGIC_DONTCARE); + if (gdiObject == 0) return 0; magic = GDIOBJ_GetHandleMagic (handle); @@ -651,10 +647,10 @@ INT STDCALL W32kGetObjectA(HANDLE handle, INT count, LPVOID buffer) /* case GO_PEN_MAGIC: result = PEN_GetObject((PENOBJ *)gdiObject, count, buffer); break; - case GO_BRUSH_MAGIC: + case GO_BRUSH_MAGIC: result = BRUSH_GetObject((BRUSHOBJ *)gdiObject, count, buffer); break; */ - case GO_BITMAP_MAGIC: + case GO_BITMAP_MAGIC: result = BITMAP_GetObject((BITMAPOBJ *)gdiObject, count, buffer); break; /* case GO_FONT_MAGIC: @@ -684,7 +680,7 @@ INT STDCALL W32kGetObjectA(HANDLE handle, INT count, LPVOID buffer) DbgPrint("Invalid GDI Magic %04x\n", magic); break; } - + GDIOBJ_UnlockObj (handle, GO_MAGIC_DONTCARE); return result; } @@ -694,10 +690,10 @@ INT STDCALL W32kGetObjectW(HANDLE handle, INT count, LPVOID buffer) INT result = 0; WORD magic; - if (!count) + if (!count) return 0; - gdiObject = GDIOBJ_HandleToPtr(handle, GO_MAGIC_DONTCARE); - if (gdiObject == 0) + gdiObject = GDIOBJ_LockObj(handle, GO_MAGIC_DONTCARE); + if (gdiObject == 0) return 0; magic = GDIOBJ_GetHandleMagic (handle); @@ -706,10 +702,10 @@ INT STDCALL W32kGetObjectW(HANDLE handle, INT count, LPVOID buffer) /* case GO_PEN_MAGIC: result = PEN_GetObject((PENOBJ *)gdiObject, count, buffer); break; - case GO_BRUSH_MAGIC: + case GO_BRUSH_MAGIC: result = BRUSH_GetObject((BRUSHOBJ *)gdiObject, count, buffer); break; */ - case GO_BITMAP_MAGIC: + case GO_BITMAP_MAGIC: result = BITMAP_GetObject((BITMAPOBJ *)gdiObject, count, buffer); break; /* case GO_FONT_MAGIC: @@ -727,10 +723,10 @@ INT STDCALL W32kGetObjectW(HANDLE handle, INT count, LPVOID buffer) // FIXME("Magic %04x not implemented\n", gdiObject->magic); break; } - + GDIOBJ_UnlockObj(handle, GO_MAGIC_DONTCARE); return result; } - + INT STDCALL W32kGetObject(HANDLE handle, INT count, LPVOID buffer) { return W32kGetObjectW(handle, count, buffer); @@ -742,20 +738,20 @@ DWORD STDCALL W32kGetObjectType(HANDLE handle) INT result = 0; WORD magic; - ptr = GDIOBJ_HandleToPtr(handle, GO_MAGIC_DONTCARE); - if (ptr == 0) + ptr = GDIOBJ_LockObj(handle, GO_MAGIC_DONTCARE); + if (ptr == 0) return 0; - + magic = GDIOBJ_GetHandleMagic (handle); switch(magic) { case GO_PEN_MAGIC: result = OBJ_PEN; break; - case GO_BRUSH_MAGIC: + case GO_BRUSH_MAGIC: result = OBJ_BRUSH; break; - case GO_BITMAP_MAGIC: + case GO_BITMAP_MAGIC: result = OBJ_BITMAP; break; case GO_FONT_MAGIC: @@ -789,7 +785,7 @@ DWORD STDCALL W32kGetObjectType(HANDLE handle) // FIXME("Magic %04x not implemented\n", magic); break; } - + GDIOBJ_UnlockObj(handle, GO_MAGIC_DONTCARE); return result; } @@ -814,26 +810,26 @@ BOOL STDCALL W32kRestoreDC(HDC hDC, INT SaveLevel) BOOL success; dc = DC_HandleToPtr(hDC); - if(!dc) + if(!dc) { return FALSE; } - - if (SaveLevel == -1) + + if (SaveLevel == -1) { SaveLevel = dc->saveLevel; } - + if ((SaveLevel < 1) || (SaveLevel > dc->saveLevel)) { return FALSE; } - + success = TRUE; while (dc->saveLevel >= SaveLevel) { HDC hdcs = DC_GetNextDC (dc); - + dcs = DC_HandleToPtr (hdcs); if (dcs == NULL) { @@ -852,9 +848,10 @@ BOOL STDCALL W32kRestoreDC(HDC hDC, INT SaveLevel) } #endif } + DC_ReleasePtr( hdcs ); W32kDeleteDC (hdcs); } - + DC_ReleasePtr( hDC ); return success; } @@ -889,10 +886,12 @@ INT STDCALL W32kSaveDC(HDC hDC) return 0; } #endif - + DC_SetNextDC (dcs, DC_GetNextDC (dc)); DC_SetNextDC (dc, hdcs); ret = ++dc->saveLevel; + DC_ReleasePtr( hdcs ); + DC_ReleasePtr( hDC ); return ret; } @@ -925,8 +924,9 @@ HGDIOBJ STDCALL W32kSelectObject(HDC hDC, HGDIOBJ hGDIObj) // Convert the color of the pen to the format of the DC PalGDI = (PPALGDI)AccessInternalObject(dc->w.hPalette); XlateObj = (PXLATEOBJ)EngCreateXlate(PalGDI->Mode, PAL_RGB, dc->w.hPalette, NULL); - pen = GDIOBJ_HandleToPtr(dc->w.hPen, GO_PEN_MAGIC); + pen = GDIOBJ_LockObj(dc->w.hPen, GO_PEN_MAGIC); pen->logpen.lopnColor = XLATEOBJ_iXlate(XlateObj, pen->logpen.lopnColor); + GDIOBJ_UnlockObj( dc->w.hPen, GO_PEN_MAGIC); break; case GO_BRUSH_MAGIC: objOrg = (HGDIOBJ)dc->w.hBrush; @@ -973,11 +973,11 @@ HGDIOBJ STDCALL W32kSelectObject(HDC hDC, HGDIOBJ hGDIObj) default: return NULL; } - + DC_ReleasePtr( hDC ); return objOrg; } -DC_SET_MODE( W32kSetBkMode, w.backgroundMode, TRANSPARENT, OPAQUE ) +DC_SET_MODE( W32kSetBkMode, w.backgroundMode, TRANSPARENT, OPAQUE ) DC_SET_MODE( W32kSetPolyFillMode, w.polyFillMode, ALTERNATE, WINDING ) // DC_SET_MODE( W32kSetRelAbs, w.relAbsMode, ABSOLUTE, RELATIVE ) DC_SET_MODE( W32kSetROP2, w.ROPmode, R2_BLACK, R2_WHITE ) @@ -987,31 +987,32 @@ COLORREF STDCALL W32kSetBkColor(HDC hDC, COLORREF color) { COLORREF oldColor; PDC dc = DC_HandleToPtr(hDC); - - if (!dc) + + if (!dc) { return 0x80000000; } - + oldColor = dc->w.backgroundColor; dc->w.backgroundColor = color; - + DC_ReleasePtr( hDC ); return oldColor; } static void W32kSetDCState16(HDC hDC, HDC hDCSave) { PDC dc, dcs; - + dc = DC_HandleToPtr(hDC); if (dc == NULL) { return; } - + dcs = DC_HandleToPtr(hDCSave); if (dcs == NULL) { + DC_ReleasePtr( hDC ); return; } if (!dcs->w.flags & DC_SAVED) @@ -1064,7 +1065,7 @@ static void W32kSetDCState16(HDC hDC, HDC hDCSave) dc->w.xformVport2World = dcs->w.xformVport2World; dc->w.vport2WorldValid = dcs->w.vport2WorldValid; #endif - + dc->wndOrgX = dcs->wndOrgX; dc->wndOrgY = dcs->wndOrgY; dc->wndExtX = dcs->wndExtX; @@ -1073,16 +1074,16 @@ static void W32kSetDCState16(HDC hDC, HDC hDCSave) dc->vportOrgY = dcs->vportOrgY; dc->vportExtX = dcs->vportExtX; dc->vportExtY = dcs->vportExtY; - - if (!(dc->w.flags & DC_MEMORY)) + + if (!(dc->w.flags & DC_MEMORY)) { dc->w.bitsPerPixel = dcs->w.bitsPerPixel; } - + #if 0 if (dcs->w.hClipRgn) { - if (!dc->w.hClipRgn) + if (!dc->w.hClipRgn) { dc->w.hClipRgn = W32kCreateRectRgn( 0, 0, 0, 0 ); } @@ -1090,16 +1091,16 @@ static void W32kSetDCState16(HDC hDC, HDC hDCSave) } else { - if (dc->w.hClipRgn) + if (dc->w.hClipRgn) { W32kDeleteObject( dc->w.hClipRgn ); } - + dc->w.hClipRgn = 0; } CLIPPING_UpdateGCRegion( dc ); #endif - + W32kSelectObject( hDC, dcs->w.hBitmap ); W32kSelectObject( hDC, dcs->w.hBrush ); W32kSelectObject( hDC, dcs->w.hFont ); @@ -1110,57 +1111,70 @@ static void W32kSetDCState16(HDC hDC, HDC hDCSave) #if 0 GDISelectPalette16( hDC, dcs->w.hPalette, FALSE ); #endif - + + DC_ReleasePtr( hDCSave ); + DC_ReleasePtr( hDC ); } // ---------------------------------------------------- Private Interface -PDC DC_AllocDC(LPCWSTR Driver) +HDC DC_AllocDC(LPCWSTR Driver) { - PDC NewDC; - - NewDC = (PDC) GDIOBJ_AllocObject(sizeof(DC), GO_DC_MAGIC); - if (NewDC == NULL) - { - return NULL; - } - if (Driver != NULL) - { - NewDC->DriverName = ExAllocatePool(PagedPool, (wcslen(Driver) + 1) * sizeof(WCHAR)); - wcscpy(NewDC->DriverName, Driver); - } - - return NewDC; + PDC NewDC; + HDC hDC; + + hDC = (HDC) GDIOBJ_AllocObj(sizeof(DC), GO_DC_MAGIC); + if (hDC == NULL) + { + return NULL; + } + + NewDC = (PDC) GDIOBJ_LockObj( hDC, GO_DC_MAGIC ); + + if (Driver != NULL) + { + NewDC->DriverName = ExAllocatePool(PagedPool, (wcslen(Driver) + 1) * sizeof(WCHAR)); + wcscpy(NewDC->DriverName, Driver); + } + + GDIOBJ_UnlockObj( hDC, GO_DC_MAGIC ); + return hDC; } -PDC DC_FindOpenDC(LPCWSTR Driver) +HDC DC_FindOpenDC(LPCWSTR Driver) { return NULL; } -void DC_InitDC(PDC DCToInit) +void DC_InitDC(HDC DCHandle) { - HDC DCHandle; - - DCHandle = DC_PtrToHandle(DCToInit); // W32kRealizeDefaultPalette(DCHandle); - W32kSetTextColor(DCHandle, DCToInit->w.textColor); - W32kSetBkColor(DCHandle, DCToInit->w.backgroundColor); - W32kSelectObject(DCHandle, DCToInit->w.hPen); - W32kSelectObject(DCHandle, DCToInit->w.hBrush); - W32kSelectObject(DCHandle, DCToInit->w.hFont); + PDC DCToInit; + if( (DCToInit = DC_HandleToPtr( DCHandle ) ) ){ + W32kSetTextColor(DCHandle, DCToInit->w.textColor); + W32kSetBkColor(DCHandle, DCToInit->w.backgroundColor); + W32kSelectObject(DCHandle, DCToInit->w.hPen); + W32kSelectObject(DCHandle, DCToInit->w.hBrush); + W32kSelectObject(DCHandle, DCToInit->w.hFont); + } + DPRINT("DC_InitDC: can't get dc for handle %d\n", DCHandle ); // CLIPPING_UpdateGCRegion(DCToInit); } -void DC_FreeDC(PDC DCToFree) +void DC_FreeDC(HDC DCToFree) { - ExFreePool(DCToFree->DriverName); - if (!GDIOBJ_FreeObject((PGDIOBJ)DCToFree, GO_DC_MAGIC)) + if (!GDIOBJ_FreeObj(DCToFree, GO_DC_MAGIC)) { DPRINT("DC_FreeDC failed\n"); } } +BOOL DC_InternalDeleteDC( PDC DCToDelete ) +{ + ExFreePool(DCToDelete->DriverName); + return TRUE; +} + HDC DC_GetNextDC (PDC pDC) { return pDC->hNext; @@ -1171,12 +1185,12 @@ void DC_SetNextDC (PDC pDC, HDC hNextDC) pDC->hNext = hNextDC; } -void +void DC_UpdateXforms(PDC dc) { XFORM xformWnd2Vport; FLOAT scaleX, scaleY; - + /* Construct a transformation to do the window-to-viewport conversion */ scaleX = (FLOAT)dc->vportExtX / (FLOAT)dc->wndExtX; scaleY = (FLOAT)dc->vportExtY / (FLOAT)dc->wndExtY; @@ -1186,32 +1200,32 @@ DC_UpdateXforms(PDC dc) xformWnd2Vport.eM22 = scaleY; xformWnd2Vport.eDx = (FLOAT)dc->vportOrgX - scaleX * (FLOAT)dc->wndOrgX; xformWnd2Vport.eDy = (FLOAT)dc->vportOrgY - scaleY * (FLOAT)dc->wndOrgY; - + /* Combine with the world transformation */ W32kCombineTransform(&dc->w.xformWorld2Vport, &dc->w.xformWorld2Wnd, &xformWnd2Vport); - + /* Create inverse of world-to-viewport transformation */ dc->w.vport2WorldValid = DC_InvertXform(&dc->w.xformWorld2Vport, &dc->w.xformVport2World); } -BOOL -DC_InvertXform(const XFORM *xformSrc, +BOOL +DC_InvertXform(const XFORM *xformSrc, XFORM *xformDest) { FLOAT determinant; - + determinant = xformSrc->eM11*xformSrc->eM22 - xformSrc->eM12*xformSrc->eM21; if (determinant > -1e-12 && determinant < 1e-12) { return FALSE; } - + xformDest->eM11 = xformSrc->eM22 / determinant; xformDest->eM12 = -xformSrc->eM12 / determinant; xformDest->eM21 = -xformSrc->eM21 / determinant; xformDest->eM22 = xformSrc->eM11 / determinant; xformDest->eDx = -xformSrc->eDx * xformDest->eM11 - xformSrc->eDy * xformDest->eM21; xformDest->eDy = -xformSrc->eDx * xformDest->eM12 - xformSrc->eDy * xformDest->eM22; - + return TRUE; } diff --git a/reactos/subsys/win32k/objects/dib.c b/reactos/subsys/win32k/objects/dib.c index cf441c54aa2..7c839bb47c7 100644 --- a/reactos/subsys/win32k/objects/dib.c +++ b/reactos/subsys/win32k/objects/dib.c @@ -7,6 +7,8 @@ #include "../eng/objects.h" #include +VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap); + UINT STDCALL W32kSetDIBColorTable(HDC hDC, UINT StartIndex, UINT Entries, @@ -78,16 +80,17 @@ INT STDCALL W32kSetDIBits(HDC hDC, // Check parameters - if (!(dc = DC_HandleToPtr(hDC))) return 0; + if (!(dc = DC_HandleToPtr(hDC))) + return 0; - if (!(bitmap = (BITMAPOBJ *)GDIOBJ_HandleToPtr(hBitmap, GO_BITMAP_MAGIC))) + if (!(bitmap = (BITMAPOBJ *)GDIOBJ_LockObj(hBitmap, GO_BITMAP_MAGIC))) { - // GDI_ReleaseObj(hDC); + DC_ReleasePtr(hDC); return 0; } // Get RGB values - if (ColorUse == DIB_PAL_COLORS) + if (ColorUse == DIB_PAL_COLORS) lpRGB = DIB_MapPaletteColors(hDC, bmi); else lpRGB = &bmi->bmiColors[0]; @@ -132,11 +135,12 @@ INT STDCALL W32kSetDIBits(HDC hDC, EngDeleteSurface(SourceBitmap); EngDeleteSurface(DestBitmap); -// if (ColorUse == DIB_PAL_COLORS) +// if (ColorUse == DIB_PAL_COLORS) // WinFree((LPSTR)lpRGB); // GDI_ReleaseObj(hBitmap); unlock? -// GDI_ReleaseObj(hDC); + GDIOBJ_UnlockObj(hBitmap, GO_BITMAP_MAGIC); + DC_ReleasePtr(hDC); return result; } @@ -182,13 +186,13 @@ INT STDCALL W32kStretchDIBits(HDC hDC, INT YDest, INT DestWidth, INT DestHeight, - INT XSrc, - INT YSrc, - INT SrcWidth, - INT SrcHeight, + INT XSrc, + INT YSrc, + INT SrcWidth, + INT SrcHeight, CONST VOID *Bits, CONST BITMAPINFO *BitsInfo, - UINT Usage, + UINT Usage, DWORD ROP) { UNIMPLEMENTED; @@ -200,20 +204,20 @@ LONG STDCALL W32kGetBitmapBits(HBITMAP hBitmap, { PBITMAPOBJ bmp; LONG height, ret; - + bmp = BITMAPOBJ_HandleToPtr (hBitmap); - if (!bmp) + if (!bmp) { return 0; } - + /* If the bits vector is null, the function should return the read size */ if (Bits == NULL) { return bmp->bitmap.bmWidthBytes * bmp->bitmap.bmHeight; } - if (Count < 0) + if (Count < 0) { DPRINT ("(%ld): Negative number of bytes passed???\n", Count); Count = -Count; @@ -221,7 +225,7 @@ LONG STDCALL W32kGetBitmapBits(HBITMAP hBitmap, /* Only get entire lines */ height = Count / bmp->bitmap.bmWidthBytes; - if (height > bmp->bitmap.bmHeight) + if (height > bmp->bitmap.bmHeight) { height = bmp->bitmap.bmHeight; } @@ -237,7 +241,7 @@ LONG STDCALL W32kGetBitmapBits(HBITMAP hBitmap, 1 << bmp->bitmap.bmBitsPixel, height ); #if 0 /* FIXME: Call DDI CopyBits here if available */ - if(bmp->DDBitmap) + if(bmp->DDBitmap) { DPRINT("Calling device specific BitmapBits\n"); if(bmp->DDBitmap->funcs->pBitmapBits) @@ -245,21 +249,21 @@ LONG STDCALL W32kGetBitmapBits(HBITMAP hBitmap, ret = bmp->DDBitmap->funcs->pBitmapBits(hbitmap, bits, count, DDB_GET); } - else + else { ERR_(bitmap)("BitmapBits == NULL??\n"); ret = 0; } - } - else + } + else #endif { - if(!bmp->bitmap.bmBits) + if(!bmp->bitmap.bmBits) { DPRINT ("Bitmap is empty\n"); ret = 0; - } - else + } + else { memcpy(Bits, bmp->bitmap.bmBits, Count); ret = Count; @@ -375,6 +379,7 @@ HBITMAP STDCALL W32kCreateDIBSection(HDC hDC, if ((dc = DC_HandleToPtr(hDC))) { hbitmap = DIB_CreateDIBSection(dc, bmi, Usage, Bits, hSection, dwOffset, 0); + DC_ReleasePtr( hDC ); } if (bDesktopDC) @@ -393,16 +398,16 @@ HBITMAP DIB_CreateDIBSection( DIBSECTION *dib = NULL; int *colorMap = NULL; int nColorMap; - + // Fill BITMAP32 structure with DIB data BITMAPINFOHEADER *bi = &bmi->bmiHeader; INT effHeight, totalSize; BITMAP bm; - + DbgPrint("format (%ld,%ld), planes %d, bpp %d, size %ld, colors %ld (%s)\n", bi->biWidth, bi->biHeight, bi->biPlanes, bi->biBitCount, bi->biSizeImage, bi->biClrUsed, usage == DIB_PAL_COLORS? "PAL" : "RGB"); - + effHeight = bi->biHeight >= 0 ? bi->biHeight : -bi->biHeight; bm.bmType = 0; bm.bmWidth = bi->biWidth; @@ -412,7 +417,7 @@ HBITMAP DIB_CreateDIBSection( bm.bmPlanes = bi->biPlanes; bm.bmBitsPixel = bi->biBitCount; bm.bmBits = NULL; - + // Get storage location for DIB bits. Only use biSizeImage if it's valid and // we're dealing with a compressed bitmap. Otherwise, use width * height. totalSize = bi->biSizeImage && bi->biCompression != BI_RGB @@ -420,13 +425,13 @@ HBITMAP DIB_CreateDIBSection( /* if (section) - bm.bmBits = MapViewOfFile(section, FILE_MAP_ALL_ACCESS, + bm.bmBits = MapViewOfFile(section, FILE_MAP_ALL_ACCESS, 0L, offset, totalSize); else if (ovr_pitch && offset) bm.bmBits = (LPVOID) offset; else { */ offset = 0; -/* bm.bmBits = VirtualAlloc(NULL, totalSize, +/* bm.bmBits = VirtualAlloc(NULL, totalSize, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); */ bm.bmBits = ExAllocatePool(NonPagedPool, totalSize); @@ -476,7 +481,7 @@ HBITMAP DIB_CreateDIBSection( } // Create Device Dependent Bitmap and add DIB pointer - if (dib) + if (dib) { res = W32kCreateDIBitmap(dc->hSelf, bi, 0, NULL, bmi, usage); if (res) @@ -500,11 +505,11 @@ HBITMAP DIB_CreateDIBSection( else if (!offset) VirtualFree(bm.bmBits, 0L, MEM_RELEASE), bm.bmBits = NULL; } */ - + if (colorMap) { ExFreePool(colorMap); colorMap = NULL; } if (dib) { ExFreePool(dib); dib = NULL; } if (bmp) { bmp = NULL; } - if (res) { GDIOBJ_FreeObject(res, GO_BITMAP_MAGIC); res = 0; } + if (res) { GDIOBJ_FreeObj(res, GO_BITMAP_MAGIC); res = 0; } } // Install fault handler, if possible @@ -525,6 +530,9 @@ HBITMAP DIB_CreateDIBSection( } } */ + if( bmp ) + BITMAPOBJ_ReleasePtr(res); + // Return BITMAP handle and storage location if (bm.bmBits && bits) *bits = bm.bmBits; return res; @@ -540,7 +548,7 @@ HBITMAP DIB_CreateDIBSection( int DIB_GetDIBWidthBytes(int width, int depth) { int words; - + switch(depth) { case 1: words = (width + 31) / 32; break; @@ -549,7 +557,7 @@ int DIB_GetDIBWidthBytes(int width, int depth) case 15: case 16: words = (width + 1) / 2; break; case 24: words = (width * 3 + 3)/4; break; - + default: DPRINT("(%d): Unsupported depth\n", depth ); /* fall through */ @@ -642,7 +650,7 @@ PBITMAPOBJ DIBtoDDB(HGLOBAL hPackedDIB, HDC hdc) // FIXME: This should be remove // GlobalUnlock(hPackedDIB); // Retrieve the internal Pixmap from the DDB - pBmp = (BITMAPOBJ *)GDIOBJ_HandleToPtr(hBmp, GO_BITMAP_MAGIC); + pBmp = (BITMAPOBJ *)GDIOBJ_LockObj(hBmp, GO_BITMAP_MAGIC); return pBmp; } diff --git a/reactos/subsys/win32k/objects/fillshap.c b/reactos/subsys/win32k/objects/fillshap.c index 721bdb7e22a..df72e91da22 100644 --- a/reactos/subsys/win32k/objects/fillshap.c +++ b/reactos/subsys/win32k/objects/fillshap.c @@ -81,15 +81,23 @@ W32kRectangle(HDC hDC, SURFOBJ *SurfObj = (SURFOBJ*)AccessUserObject(dc->Surface); PBRUSHOBJ BrushObj; BOOL ret; - PRECTL RectBounds = GDIOBJ_HandleToPtr(dc->w.hGCClipRgn, GO_REGION_MAGIC); + PRECTL RectBounds; + PENOBJ * pen; - if(!dc) return FALSE; + if(!dc) + return FALSE; + + RectBounds = GDIOBJ_LockObj(dc->w.hGCClipRgn, GO_REGION_MAGIC); + //ei not yet implemented ASSERT(RectBounds); if(PATH_IsPathOpen(dc->w.path)) { ret = PATH_Rectangle(hDC, LeftRect, TopRect, RightRect, BottomRect); } else { // Draw the rectangle with the current pen - BrushObj = (PBRUSHOBJ)PenToBrushObj(dc, GDIOBJ_HandleToPtr(dc->w.hPen, GO_PEN_MAGIC)); + pen = (PENOBJ*) GDIOBJ_LockObj(dc->w.hPen, GO_PEN_MAGIC); + ASSERT(pen); + BrushObj = (PBRUSHOBJ)PenToBrushObj(dc, pen); + GDIOBJ_UnlockObj( dc->w.hPen, GO_PEN_MAGIC ); ret = EngLineTo(SurfObj, NULL, // ClipObj, @@ -123,7 +131,8 @@ W32kRectangle(HDC hDC, } // FIXME: Move current position in DC? - + GDIOBJ_UnlockObj(dc->w.hGCClipRgn, GO_REGION_MAGIC); + DC_ReleasePtr( hDC ); return TRUE; } @@ -131,8 +140,8 @@ BOOL STDCALL W32kRoundRect(HDC hDC, int LeftRect, - int TopRect, - int RightRect, + int TopRect, + int RightRect, int BottomRect, int Width, int Height) diff --git a/reactos/subsys/win32k/objects/gdiobj.c b/reactos/subsys/win32k/objects/gdiobj.c index ccc1f128380..10f818b55bc 100644 --- a/reactos/subsys/win32k/objects/gdiobj.c +++ b/reactos/subsys/win32k/objects/gdiobj.c @@ -1,7 +1,7 @@ /* * GDIOBJ.C - GDI object manipulation routines * - * $Id: gdiobj.c,v 1.11 2001/11/02 06:10:11 rex Exp $ + * $Id: gdiobj.c,v 1.12 2002/07/13 21:37:27 ei Exp $ * */ @@ -12,6 +12,10 @@ #include #include #include +#include +#include +//#define NDEBUG +#include // GDI stock objects @@ -100,21 +104,25 @@ HBITMAP hPseudoStockBitmap; /* 1x1 bitmap for memory DCs */ static PGDI_HANDLE_TABLE HandleTable = 0; static FAST_MUTEX HandleTableMutex; +static FAST_MUTEX RefCountHandling; + +#define GDI_HANDLE_NUMBER 0x4000 static PGDI_HANDLE_TABLE GDIOBJ_iAllocHandleTable (WORD Size) { PGDI_HANDLE_TABLE handleTable; -// ExAcquireFastMutexUnsafe (&HandleTableMutex); - handleTable = ExAllocatePool(PagedPool, - sizeof (GDI_HANDLE_TABLE) + + ExAcquireFastMutexUnsafe (&HandleTableMutex); + handleTable = ExAllocatePool(PagedPool, + sizeof (GDI_HANDLE_TABLE) + sizeof (GDI_HANDLE_ENTRY) * Size); - memset (handleTable, - 0, + ASSERT( handleTable ); + memset (handleTable, + 0, sizeof (GDI_HANDLE_TABLE) + sizeof (GDI_HANDLE_ENTRY) * Size); handleTable->wTableSize = Size; -// ExReleaseFastMutexUnsafe (&HandleTableMutex); + ExReleaseFastMutexUnsafe (&HandleTableMutex); return handleTable; } @@ -122,7 +130,10 @@ GDIOBJ_iAllocHandleTable (WORD Size) static PGDI_HANDLE_ENTRY GDIOBJ_iGetHandleEntryForIndex (WORD TableIndex) { - return &HandleTable->Handles [TableIndex]; + //DPRINT("GDIOBJ_iGetHandleEntryForIndex: TableIndex: %d,\n handle: %x, ptr: %x\n", TableIndex, HandleTable->Handles [TableIndex], &(HandleTable->Handles [TableIndex]) ); + //DPRINT("GIG: HandleTable: %x, Handles: %x, \n TableIndex: %x, pt: %x\n", HandleTable, HandleTable->Handles, TableIndex, ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex)); + DPRINT("GIG: Hndl: %x, mag: %x\n", ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex), ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex)->wMagic); + return ((PGDI_HANDLE_ENTRY)HandleTable->Handles+TableIndex); } static WORD @@ -130,7 +141,7 @@ GDIOBJ_iGetNextOpenHandleIndex (void) { WORD tableIndex; -// ExAcquireFastMutexUnsafe (&HandleTableMutex); + ExAcquireFastMutexUnsafe (&HandleTableMutex); for (tableIndex = 1; tableIndex < HandleTable->wTableSize; tableIndex++) { if (HandleTable->Handles [tableIndex].wMagic == 0) @@ -139,12 +150,156 @@ GDIOBJ_iGetNextOpenHandleIndex (void) break; } } -// ExReleaseFastMutexUnsafe (&HandleTableMutex); - + ExReleaseFastMutexUnsafe (&HandleTableMutex); + return (tableIndex < HandleTable->wTableSize) ? tableIndex : 0; } -PGDIOBJ GDIOBJ_AllocObject(WORD Size, WORD Magic) +/*-----------------7/12/2002 11:38AM---------------- + * Allocate memory for GDI object and return handle to it + * Use GDIOBJ_Lock to obtain pointer to the new object. + * --------------------------------------------------*/ +HGDIOBJ GDIOBJ_AllocObj(WORD Size, WORD Magic) +{ + PGDIOBJHDR newObject; + PGDI_HANDLE_ENTRY handleEntry; + + DPRINT("GDIOBJ_AllocObj: size: %d, magic: %x\n", Size, Magic); + newObject = ExAllocatePool (PagedPool, Size + sizeof (GDIOBJHDR)); + if (newObject == NULL) + { + return NULL; + } + RtlZeroMemory (newObject, Size + sizeof (GDIOBJHDR)); + + newObject->wTableIndex = GDIOBJ_iGetNextOpenHandleIndex (); + newObject->dwCount = 0; + handleEntry = GDIOBJ_iGetHandleEntryForIndex (newObject->wTableIndex); + handleEntry->wMagic = Magic; + handleEntry->hProcessId = PsGetCurrentProcessId (); + handleEntry->pObject = newObject; + DPRINT("GDIOBJ_AllocObj: object handle %d\n", newObject->wTableIndex ); + return (HGDIOBJ) newObject->wTableIndex; +} + +BOOL GDIOBJ_FreeObj(HGDIOBJ hObj, WORD Magic) +{ + PGDIOBJHDR objectHeader; + PGDI_HANDLE_ENTRY handleEntry; + PGDIOBJ Obj; + BOOL bRet = TRUE; + + handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD)hObj & 0xffff); + DPRINT("GDIOBJ_FreeObj: hObj: %d, magic: %x, handleEntry: %x\n", hObj, Magic, handleEntry ); + if (handleEntry == 0 || (handleEntry->wMagic != Magic && handleEntry->wMagic != GO_MAGIC_DONTCARE ) + || handleEntry->hProcessId != PsGetCurrentProcessId ()) + return FALSE; + + objectHeader = (PGDIOBJHDR) handleEntry->pObject; + ASSERT(objectHeader); + + // check that the reference count is zero. if not then set flag + // and delete object when releaseobj is called + ExAcquireFastMutex(&RefCountHandling); + if( ( objectHeader->dwCount & ~0x80000000 ) > 0 ){ + objectHeader->dwCount |= 0x80000000; + DPRINT("GDIOBJ_FreeObj: delayed object deletion"); + ExReleaseFastMutex(&RefCountHandling); + return TRUE; + } + ExReleaseFastMutex(&RefCountHandling); + + //allow object to delete internal data + Obj = (PGDIOBJ)((PCHAR)handleEntry->pObject + sizeof(GDIOBJHDR)); + switch( handleEntry->wMagic ){ + case GO_REGION_MAGIC: + + case GO_PEN_MAGIC: + case GO_PALETTE_MAGIC: + case GO_BITMAP_MAGIC: + bRet = Bitmap_InternalDelete( (PBITMAPOBJ) Obj ); + break; + case GO_DC_MAGIC: + bRet = DC_InternalDeleteDC( (PDC) Obj ); + break; + case GO_DISABLED_DC_MAGIC: + case GO_META_DC_MAGIC: + case GO_METAFILE_MAGIC: + case GO_METAFILE_DC_MAGIC: + case GO_ENHMETAFILE_MAGIC: + case GO_ENHMETAFILE_DC_MAGIC: + + case GO_BRUSH_MAGIC: + case GO_FONT_MAGIC: + break; + } + handleEntry->hProcessId = 0; + ExFreePool (handleEntry->pObject); + handleEntry->pObject = 0; + // (RJJ) set wMagic last to avoid race condition + handleEntry->wMagic = 0; + + + return TRUE; +} + +PGDIOBJ GDIOBJ_LockObj( HGDIOBJ hObj, WORD Magic ) +{ + PGDI_HANDLE_ENTRY handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD) hObj & 0xffff); + PGDIOBJHDR objectHeader; + + DPRINT("GDIOBJ_LockObj: hObj: %d, magic: %x, \n handleEntry: %x, mag %x\n", hObj, Magic, handleEntry, handleEntry->wMagic); + if (handleEntry == 0 || (handleEntry->wMagic != Magic && handleEntry->wMagic != GO_MAGIC_DONTCARE ) + || handleEntry->hProcessId != PsGetCurrentProcessId () ) + return NULL; + + objectHeader = (PGDIOBJHDR) handleEntry->pObject; + ASSERT(objectHeader); + + ExAcquireFastMutex(&RefCountHandling); + objectHeader->dwCount++; + ExReleaseFastMutex(&RefCountHandling); + + DPRINT("GDIOBJ_LockObj: PGDIOBJ %x\n", ((PCHAR)objectHeader + sizeof(GDIOBJHDR)) ); + return (PGDIOBJ)((PCHAR)objectHeader + sizeof(GDIOBJHDR)); +} + +BOOL GDIOBJ_UnlockObj( HGDIOBJ hObj, WORD Magic ) +{ + PGDI_HANDLE_ENTRY handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD) hObj & 0xffff); + PGDIOBJHDR objectHeader; + + DPRINT("GDIOBJ_UnlockObj: hObj: %d, magic: %x, \n handleEntry: %x\n", hObj, Magic, handleEntry); + if (handleEntry == 0 || (handleEntry->wMagic != Magic && handleEntry->wMagic != GO_MAGIC_DONTCARE ) + || handleEntry->hProcessId != PsGetCurrentProcessId ()) + return FALSE; + + objectHeader = (PGDIOBJHDR) handleEntry->pObject; + ASSERT(objectHeader); + + ExAcquireFastMutex(&RefCountHandling); + if( ( objectHeader->dwCount & ~0x80000000 ) == 0 ){ + ExReleaseFastMutex(&RefCountHandling); + DPRINT( "GDIOBJ_UnLockObj: unlock object that is not locked\n" ); + return FALSE; + } + + objectHeader = (PGDIOBJHDR) handleEntry->pObject; + ASSERT(objectHeader); + objectHeader->dwCount--; + + if( objectHeader->dwCount == 0x80000000 ){ + //delayed object release + ExReleaseFastMutex(&RefCountHandling); + DPRINT("GDIOBJ_UnlockObj: delayed delete\n"); + return GDIOBJ_FreeObj( hObj, Magic ); + } + ExReleaseFastMutex(&RefCountHandling); + return TRUE; +} + +/* +PGDIOBJ GDIOBJ_AllocObject(WORD Size, WORD Magic) { PGDIOBJHDR newObject; PGDI_HANDLE_ENTRY handleEntry; @@ -159,7 +314,7 @@ PGDIOBJ GDIOBJ_AllocObject(WORD Size, WORD Magic) newObject->wTableIndex = GDIOBJ_iGetNextOpenHandleIndex (); handleEntry = GDIOBJ_iGetHandleEntryForIndex (newObject->wTableIndex); handleEntry->wMagic = Magic; - handleEntry->hProcessId = 0; // PsGetCurrentProcessId (); + handleEntry->hProcessId = PsGetCurrentProcessId (); handleEntry->pObject = newObject; return (PGDIOBJ)(((PCHAR) newObject) + sizeof (GDIOBJHDR)); @@ -187,16 +342,16 @@ HGDIOBJ GDIOBJ_PtrToHandle (PGDIOBJ Obj, WORD Magic) { PGDIOBJHDR objectHeader; PGDI_HANDLE_ENTRY handleEntry; - - if (Obj == NULL) + + if (Obj == NULL) return NULL; objectHeader = (PGDIOBJHDR) (((PCHAR)Obj) - sizeof (GDIOBJHDR)); handleEntry = GDIOBJ_iGetHandleEntryForIndex (objectHeader->wTableIndex); - if (handleEntry == 0 || + if (handleEntry == 0 || handleEntry->wMagic != Magic || - handleEntry->hProcessId != 0 /* PsGetCurrentProcess () */) + handleEntry->hProcessId != PsGetCurrentProcessId () ) return NULL; - + return (HGDIOBJ) objectHeader->wTableIndex; } @@ -208,13 +363,14 @@ PGDIOBJ GDIOBJ_HandleToPtr (HGDIOBJ ObjectHandle, WORD Magic) return NULL; handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD)ObjectHandle & 0xffff); - if (handleEntry == 0 || + if (handleEntry == 0 || (Magic != GO_MAGIC_DONTCARE && handleEntry->wMagic != Magic) || - handleEntry->hProcessId != 0 /* PsGetCurrentProcess () */) + handleEntry->hProcessId != PsGetCurrentProcessId () ) return NULL; return (PGDIOBJ) (((PCHAR)handleEntry->pObject) + sizeof (GDIOBJHDR)); } +*/ WORD GDIOBJ_GetHandleMagic (HGDIOBJ ObjectHandle) { @@ -224,8 +380,8 @@ WORD GDIOBJ_GetHandleMagic (HGDIOBJ ObjectHandle) return 0; handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD)ObjectHandle & 0xffff); - if (handleEntry == 0 || - handleEntry->hProcessId != 0 /* PsGetCurrentProcess () */) + if (handleEntry == 0 || + handleEntry->hProcessId != PsGetCurrentProcessId ()) return 0; return handleEntry->wMagic; @@ -234,9 +390,13 @@ WORD GDIOBJ_GetHandleMagic (HGDIOBJ ObjectHandle) VOID InitGdiObjectHandleTable (void) { - DbgPrint ("InitGdiObjectHandleTable\n"); -// ExInitializeFastMutex (&HandleTableMutex); - HandleTable = GDIOBJ_iAllocHandleTable (0x1000); + DPRINT ("InitGdiObjectHandleTable\n"); + ExInitializeFastMutex (&HandleTableMutex); + ExInitializeFastMutex (&RefCountHandling); + //per http://www.wd-mag.com/articles/1999/9902/9902b/9902b.htm?topic=articles + //gdi handle table can hold 0x4000 handles + HandleTable = GDIOBJ_iAllocHandleTable (GDI_HANDLE_NUMBER); + DPRINT("HandleTable: %x\n", HandleTable ); } VOID CreateStockObjects(void) @@ -276,3 +436,50 @@ HGDIOBJ STDCALL W32kGetStockObject(INT Object) return StockObjects[Object]; // FIXME........ } + +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 ); +} + +// dump all the objects for process. if process == 0 dump all the objects +VOID STDCALL W32kDumpGdiObjects( INT Process ) +{ + DWORD i; + PGDI_HANDLE_ENTRY handleEntry; + PGDIOBJHDR objectHeader; + + for( i=1; i < GDI_HANDLE_NUMBER; i++ ){ + handleEntry = GDIOBJ_iGetHandleEntryForIndex ((WORD) i & 0xffff); + if( handleEntry && handleEntry->wMagic != 0 ){ + objectHeader = (PGDIOBJHDR) handleEntry->pObject; + DPRINT("\nHandle: %d, magic: %x \n process: %d, locks: %d", i, handleEntry->wMagic, handleEntry->hProcessId, objectHeader->dwCount); + } + } + +} diff --git a/reactos/subsys/win32k/objects/line.c b/reactos/subsys/win32k/objects/line.c index 36e85124310..e4c8cf72f7c 100644 --- a/reactos/subsys/win32k/objects/line.c +++ b/reactos/subsys/win32k/objects/line.c @@ -28,11 +28,11 @@ STDCALL W32kArc(HDC hDC, int LeftRect, int TopRect, - int RightRect, + int RightRect, int BottomRect, int XStartArc, int YStartArc, - int XEndArc, + int XEndArc, int YEndArc) { DC *dc = DC_HandleToPtr(hDC); @@ -42,6 +42,7 @@ W32kArc(HDC hDC, return PATH_Arc(hDC, LeftRect, TopRect, RightRect, BottomRect, XStartArc, YStartArc, XEndArc, YEndArc); + DC_ReleasePtr( hDC ); // EngArc(dc, LeftRect, TopRect, RightRect, BottomRect, UNIMPLEMENTED // XStartArc, YStartArc, XEndArc, YEndArc); } @@ -74,7 +75,7 @@ W32kArcTo(HDC hDC, { W32kMoveToEx(hDC, XRadial2, YRadial2, NULL); } - + DC_ReleasePtr( hDC ); return result; } @@ -84,7 +85,7 @@ W32kGetArcDirection(HDC hDC) { PDC dc; int ret; - + dc = DC_HandleToPtr (hDC); if (!dc) { @@ -92,7 +93,7 @@ W32kGetArcDirection(HDC hDC) } ret = dc->w.ArcDirection; - + DC_ReleasePtr( hDC ); return ret; } @@ -105,24 +106,35 @@ W32kLineTo(HDC hDC, DC *dc = DC_HandleToPtr(hDC); SURFOBJ *SurfObj = (SURFOBJ*)AccessUserObject(dc->Surface); BOOL ret; + PPENOBJ pen; + PRGNDATA reg; if(!dc) return FALSE; if(PATH_IsPathOpen(dc->w.path)) { ret = PATH_LineTo(hDC, XEnd, YEnd); } else { + pen = (PPENOBJ) GDIOBJ_LockObj(dc->w.hPen, GO_PEN_MAGIC); + reg = (PRGNDATA)GDIOBJ_LockObj(dc->w.hGCClipRgn, GO_REGION_MAGIC); + + ASSERT( pen ); + // not yet implemented ASSERT( reg ); + ret = EngLineTo(SurfObj, NULL, // ClipObj - PenToBrushObj(dc, GDIOBJ_HandleToPtr(dc->w.hPen, GO_PEN_MAGIC)), + PenToBrushObj(dc, pen), dc->w.CursPosX, dc->w.CursPosY, XEnd, YEnd, - GDIOBJ_HandleToPtr(dc->w.hGCClipRgn, GO_REGION_MAGIC), // Bounding rectangle + reg, // Bounding rectangle dc->w.ROPmode); // MIX + + GDIOBJ_UnlockObj( dc->w.hGCClipRgn, GO_REGION_MAGIC ); + GDIOBJ_UnlockObj( dc->w.hPen, GO_PEN_MAGIC); } if(ret) { dc->w.CursPosX = XEnd; dc->w.CursPosY = YEnd; } - + DC_ReleasePtr( hDC ); return ret; } @@ -144,9 +156,11 @@ W32kMoveToEx(HDC hDC, dc->w.CursPosX = X; dc->w.CursPosY = Y; - if(PATH_IsPathOpen(dc->w.path)) + if(PATH_IsPathOpen(dc->w.path)){ + DC_ReleasePtr( hDC ); return PATH_MoveTo(hDC); - + } + DC_ReleasePtr( hDC ); return FALSE; } @@ -159,8 +173,10 @@ W32kPolyBezier(HDC hDC, DC *dc = DC_HandleToPtr(hDC); if(!dc) return FALSE; - if(PATH_IsPathOpen(dc->w.path)) + if(PATH_IsPathOpen(dc->w.path)){ + DC_ReleasePtr( hDC ); return PATH_PolyBezier(hDC, pt, Count); + } /* We'll convert it into line segments and draw them using Polyline */ { @@ -173,6 +189,7 @@ W32kPolyBezier(HDC hDC, DbgPrint("Pts = %p, no = %d\n", Pts, nOut); ret = W32kPolyline(dc->hSelf, Pts, nOut); ExFreePool(Pts); + DC_ReleasePtr( hDC ); return ret; } } @@ -204,6 +221,7 @@ W32kPolyBezierTo(HDC hDC, dc->w.CursPosX = pt[Count-1].x; dc->w.CursPosY = pt[Count-1].y; } + DC_ReleasePtr( hDC ); return ret; } @@ -255,6 +273,7 @@ W32kPolylineTo(HDC hDC, dc->w.CursPosX = pt[Count-1].x; dc->w.CursPosY = pt[Count-1].y; } + DC_ReleasePtr( hDC ); return ret; } @@ -284,11 +303,12 @@ W32kSetArcDirection(HDC hDC, if (ArcDirection != AD_COUNTERCLOCKWISE && ArcDirection != AD_CLOCKWISE) { // SetLastError(ERROR_INVALID_PARAMETER); + DC_ReleasePtr( hDC ); return 0; } nOldDirection = dc->w.ArcDirection; dc->w.ArcDirection = ArcDirection; - + DC_ReleasePtr( hDC ); return nOldDirection; } diff --git a/reactos/subsys/win32k/objects/objconv.c b/reactos/subsys/win32k/objects/objconv.c index bf1914f20c6..9dbbe03e076 100644 --- a/reactos/subsys/win32k/objects/objconv.c +++ b/reactos/subsys/win32k/objects/objconv.c @@ -13,6 +13,10 @@ #include #include "../eng/objects.h" +//#define NDEBUG +#include + + PBRUSHOBJ PenToBrushObj(PDC dc, PENOBJ *pen) { BRUSHOBJ *BrushObj; @@ -26,17 +30,21 @@ PBRUSHOBJ PenToBrushObj(PDC dc, PENOBJ *pen) VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap) { - if(Bitmap->dib) - { - SurfGDI->BitsPerPixel = Bitmap->dib->dsBm.bmBitsPixel; - SurfObj->lDelta = Bitmap->dib->dsBm.bmWidthBytes; - SurfObj->pvBits = Bitmap->dib->dsBm.bmBits; - SurfObj->cjBits = Bitmap->dib->dsBm.bmHeight * Bitmap->dib->dsBm.bmWidthBytes; - } else { - SurfGDI->BitsPerPixel = Bitmap->bitmap.bmBitsPixel; - SurfObj->lDelta = Bitmap->bitmap.bmWidthBytes; - SurfObj->pvBits = Bitmap->bitmap.bmBits; - SurfObj->cjBits = Bitmap->bitmap.bmHeight * Bitmap->bitmap.bmWidthBytes; + ASSERT( SurfGDI ); + if( Bitmap ){ + if(Bitmap->dib) + { + SurfGDI->BitsPerPixel = Bitmap->dib->dsBm.bmBitsPixel; + SurfObj->lDelta = Bitmap->dib->dsBm.bmWidthBytes; + SurfObj->pvBits = Bitmap->dib->dsBm.bmBits; + SurfObj->cjBits = Bitmap->dib->dsBm.bmHeight * Bitmap->dib->dsBm.bmWidthBytes; + } else { + SurfGDI->BitsPerPixel = Bitmap->bitmap.bmBitsPixel; + SurfObj->lDelta = Bitmap->bitmap.bmWidthBytes; + SurfObj->pvBits = Bitmap->bitmap.bmBits; + SurfObj->cjBits = Bitmap->bitmap.bmHeight * Bitmap->bitmap.bmWidthBytes; + } + SurfObj->sizlBitmap = Bitmap->size; // FIXME: alloc memory for our own struct? } SurfObj->dhsurf = NULL; @@ -44,7 +52,6 @@ VOID BitmapToSurf(HDC hdc, PSURFGDI SurfGDI, PSURFOBJ SurfObj, PBITMAPOBJ Bitmap SurfObj->dhpdev = NULL; SurfObj->hdev = NULL; SurfObj->pvScan0 = SurfObj->pvBits; // start of bitmap - SurfObj->sizlBitmap = Bitmap->size; // FIXME: alloc memory for our own struct? SurfObj->iUniq = 0; // not sure.. SurfObj->iBitmapFormat = BitmapFormat(SurfGDI->BitsPerPixel, BI_RGB); SurfObj->iType = STYPE_BITMAP; diff --git a/reactos/subsys/win32k/objects/path.c b/reactos/subsys/win32k/objects/path.c index 9145de40f3c..c61ec65fd36 100644 --- a/reactos/subsys/win32k/objects/path.c +++ b/reactos/subsys/win32k/objects/path.c @@ -203,11 +203,11 @@ BOOL PATH_AssignGdiPath(GdiPath *pPathDest, const GdiPath *pPathSrc) BOOL PATH_MoveTo(HDC hdc) { GdiPath *pPath; - + /* Get pointer to path */ if(!PATH_GetPathFromHDC(hdc, &pPath)) return FALSE; - + /* Check that path is open */ if(pPath->state!=PATH_Open) /* FIXME: Do we have to call SetLastError? */ @@ -230,11 +230,11 @@ BOOL PATH_LineTo(HDC hdc, INT x, INT y) { GdiPath *pPath; POINT point, pointCurPos; - + /* Get pointer to path */ if(!PATH_GetPathFromHDC(hdc, &pPath)) return FALSE; - + /* Check that path is open */ if(pPath->state!=PATH_Open) return FALSE; @@ -244,7 +244,7 @@ BOOL PATH_LineTo(HDC hdc, INT x, INT y) point.y=y; if(!W32kLPtoDP(hdc, &point, 1)) return FALSE; - + /* Add a PT_MOVETO if necessary */ if(pPath->newStroke) { @@ -255,7 +255,7 @@ BOOL PATH_LineTo(HDC hdc, INT x, INT y) if(!PATH_AddEntry(pPath, &pointCurPos, PT_MOVETO)) return FALSE; } - + /* Add a PT_LINETO entry */ return PATH_AddEntry(pPath, &point, PT_LINETO); } @@ -274,7 +274,7 @@ BOOL PATH_Rectangle(HDC hdc, INT x1, INT y1, INT x2, INT y2) /* Get pointer to path */ if(!PATH_GetPathFromHDC(hdc, &pPath)) return FALSE; - + /* Check that path is open */ if(pPath->state!=PATH_Open) return FALSE; @@ -286,7 +286,7 @@ BOOL PATH_Rectangle(HDC hdc, INT x1, INT y1, INT x2, INT y2) corners[1].y=y2; if(!W32kLPtoDP(hdc, corners, 2)) return FALSE; - + /* Make sure first corner is top left and second corner is bottom right */ if(corners[0].x>corners[1].x) { @@ -300,7 +300,7 @@ BOOL PATH_Rectangle(HDC hdc, INT x1, INT y1, INT x2, INT y2) corners[0].y=corners[1].y; corners[1].y=temp; } - + /* In GM_COMPATIBLE, don't include bottom and right edges */ if(W32kGetGraphicsMode(hdc)==GM_COMPATIBLE) { @@ -342,7 +342,7 @@ BOOL PATH_Rectangle(HDC hdc, INT x1, INT y1, INT x2, INT y2) } /* PATH_Ellipse - * + * * Should be called when a call to Ellipse is performed on a DC that has * an open path. This adds four Bezier splines representing the ellipse * to the path. Returns TRUE if successful, else FALSE. @@ -374,27 +374,33 @@ BOOL PATH_Arc(HDC hdc, INT x1, INT y1, INT x2, INT y2, /* FIXME: This function should check for all possible error returns */ /* FIXME: Do we have to respect newStroke? */ - + /* Get pointer to DC */ pDC=DC_HandleToPtr(hdc); if(pDC==NULL) return FALSE; /* Get pointer to path */ - if(!PATH_GetPathFromHDC(hdc, &pPath)) + if(!PATH_GetPathFromHDC(hdc, &pPath)){ + DC_ReleasePtr( hdc ); return FALSE; - + } + /* Check that path is open */ - if(pPath->state!=PATH_Open) + if(pPath->state!=PATH_Open){ + DC_ReleasePtr( hdc ); return FALSE; + } /* FIXME: Do we have to close the current figure? */ - + /* Check for zero height / width */ /* FIXME: Only in GM_COMPATIBLE? */ - if(x1==x2 || y1==y2) + if(x1==x2 || y1==y2){ + DC_ReleasePtr( hdc ); return TRUE; - + } + /* Convert points to device coordinates */ corners[0].x=(FLOAT)x1; corners[0].y=(FLOAT)y1; @@ -453,7 +459,7 @@ BOOL PATH_Arc(HDC hdc, INT x1, INT y1, INT x2, INT y2, corners[1].x--; corners[1].y--; } - + /* Add the arc to the path with one Bezier spline per quadrant that the * arc spans */ start=TRUE; @@ -494,6 +500,7 @@ BOOL PATH_Arc(HDC hdc, INT x1, INT y1, INT x2, INT y2, start=FALSE; } while(!end); + DC_ReleasePtr( hdc ); return TRUE; } @@ -505,7 +512,7 @@ BOOL PATH_PolyBezierTo(HDC hdc, const POINT *pts, DWORD cbPoints) if(!PATH_GetPathFromHDC(hdc, &pPath)) return FALSE; - + /* Check that path is open */ if(pPath->state!=PATH_Open) return FALSE; @@ -529,7 +536,7 @@ BOOL PATH_PolyBezierTo(HDC hdc, const POINT *pts, DWORD cbPoints) } return TRUE; } - + BOOL PATH_PolyBezier(HDC hdc, const POINT *pts, DWORD cbPoints) { GdiPath *pPath; @@ -538,7 +545,7 @@ BOOL PATH_PolyBezier(HDC hdc, const POINT *pts, DWORD cbPoints) if(!PATH_GetPathFromHDC(hdc, &pPath)) return FALSE; - + /* Check that path is open */ if(pPath->state!=PATH_Open) return FALSE; @@ -560,7 +567,7 @@ BOOL PATH_Polyline(HDC hdc, const POINT *pts, DWORD cbPoints) if(!PATH_GetPathFromHDC(hdc, &pPath)) return FALSE; - + /* Check that path is open */ if(pPath->state!=PATH_Open) return FALSE; @@ -573,7 +580,7 @@ BOOL PATH_Polyline(HDC hdc, const POINT *pts, DWORD cbPoints) } return TRUE; } - + BOOL PATH_PolylineTo(HDC hdc, const POINT *pts, DWORD cbPoints) { GdiPath *pPath; @@ -582,7 +589,7 @@ BOOL PATH_PolylineTo(HDC hdc, const POINT *pts, DWORD cbPoints) if(!PATH_GetPathFromHDC(hdc, &pPath)) return FALSE; - + /* Check that path is open */ if(pPath->state!=PATH_Open) return FALSE; @@ -617,7 +624,7 @@ BOOL PATH_Polygon(HDC hdc, const POINT *pts, DWORD cbPoints) if(!PATH_GetPathFromHDC(hdc, &pPath)) return FALSE; - + /* Check that path is open */ if(pPath->state!=PATH_Open) return FALSE; @@ -642,7 +649,7 @@ BOOL PATH_PolyPolygon( HDC hdc, const POINT* pts, const INT* counts, if(!PATH_GetPathFromHDC(hdc, &pPath)) return FALSE; - + /* Check that path is open */ if(pPath->state!=PATH_Open) return FALSE; @@ -670,7 +677,7 @@ BOOL PATH_PolyPolyline( HDC hdc, const POINT* pts, const DWORD* counts, if(!PATH_GetPathFromHDC(hdc, &pPath)) return FALSE; - + /* Check that path is open */ if(pPath->state!=PATH_Open) return FALSE; @@ -685,7 +692,7 @@ BOOL PATH_PolyPolyline( HDC hdc, const POINT* pts, const DWORD* counts, } return TRUE; } - + /*********************************************************************** * Internal functions */ @@ -738,7 +745,7 @@ static BOOL PATH_FlattenPath(GdiPath *pPath) PATH_EmptyPath(&newPath); return TRUE; } - + /* PATH_PathToRegion * * Creates a region from the specified path using the specified polygon @@ -760,7 +767,7 @@ static BOOL PATH_PathToRegion(const GdiPath *pPath, INT nPolyFillMode, PATH_FlattenPath(pPath); /* FIXME: What happens when number of points is zero? */ - + /* First pass: Find out how many strokes there are in the path */ /* FIXME: We could eliminate this with some bookkeeping in GdiPath */ numStrokes=0; @@ -775,7 +782,7 @@ static BOOL PATH_PathToRegion(const GdiPath *pPath, INT nPolyFillMode, // SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; } - + /* Second pass: remember number of points in each polygon */ iStroke=-1; /* Will get incremented to 0 at beginning of first stroke */ for(i=0; inumEntriesUsed; i++) @@ -828,7 +835,7 @@ static void PATH_EmptyPath(GdiPath *pPath) BOOL PATH_AddEntry(GdiPath *pPath, const POINT *pPoint, BYTE flags) { assert(pPath!=NULL); - + /* FIXME: If newStroke is true, perhaps we want to check that we're * getting a PT_MOVETO */ @@ -836,7 +843,7 @@ BOOL PATH_AddEntry(GdiPath *pPath, const POINT *pPoint, BYTE flags) /* Check that path is open */ if(pPath->state!=PATH_Open) return FALSE; - + /* Reserve enough memory for an extra path entry */ if(!PATH_ReserveEntries(pPath, pPath->numEntriesUsed+1)) return FALSE; @@ -866,7 +873,7 @@ static BOOL PATH_ReserveEntries(GdiPath *pPath, INT numEntries) INT numEntriesToAllocate; POINT *pPointsNew; BYTE *pFlagsNew; - + assert(pPath!=NULL); assert(numEntries>=0); @@ -927,9 +934,10 @@ static BOOL PATH_GetPathFromHDC(HDC hdc, GdiPath **ppPath) if(pDC) { *ppPath=&pDC->w.path; + DC_ReleasePtr( hdc ); return TRUE; - } else - return FALSE; + } + return FALSE; } /* PATH_DoArcPart @@ -972,7 +980,7 @@ static BOOL PATH_DoArcPart(GdiPath *pPath, FLOAT_POINT corners[], xNorm[i]=cos(angleStart); yNorm[i]=sin(angleStart); } - + /* Add starting point to path if desired */ if(addMoveTo) { diff --git a/reactos/subsys/win32k/objects/pen.c b/reactos/subsys/win32k/objects/pen.c index 34b51ecf798..d46cc60ddf3 100644 --- a/reactos/subsys/win32k/objects/pen.c +++ b/reactos/subsys/win32k/objects/pen.c @@ -12,7 +12,7 @@ W32kCreatePen(INT PenStyle, INT Width, COLORREF Color) { LOGPEN logpen; - logpen.lopnStyle = PenStyle; + logpen.lopnStyle = PenStyle; logpen.lopnWidth.x = Width; logpen.lopnWidth.y = 0; logpen.lopnColor = Color; @@ -29,14 +29,16 @@ W32kCreatePenIndirect(CONST PLOGPEN lgpn) if (lgpn->lopnStyle > PS_INSIDEFRAME) return 0; - penPtr = PENOBJ_AllocPen(); - hpen = PENOBJ_PtrToHandle(penPtr); + hpen = PENOBJ_AllocPen(); if (!hpen) return 0; + penPtr = PENOBJ_LockPen( hpen ); + ASSERT( penPtr ); + penPtr->logpen.lopnStyle = lgpn->lopnStyle; penPtr->logpen.lopnWidth = lgpn->lopnWidth; penPtr->logpen.lopnColor = lgpn->lopnColor; - + PENOBJ_UnlockPen( hpen ); return hpen; } diff --git a/reactos/subsys/win32k/objects/region.c b/reactos/subsys/win32k/objects/region.c index 1d4cffd6b05..e42aeb10196 100644 --- a/reactos/subsys/win32k/objects/region.c +++ b/reactos/subsys/win32k/objects/region.c @@ -11,11 +11,13 @@ INT STDCALL W32kGetBoxRgn(HRGN hRgn, PRECT Rect) { + return 0; } HRGN STDCALL W32kCropRgn(HRGN hDest, HRGN hSrc, const RECT* Rect, const POINT* Point) { + return NULL; } INT STDCALL @@ -67,7 +69,7 @@ W32kCreateRectRgn(INT LeftRect, { RGNDATA* Region; PRECT Rect; - +/* DPRINT("W32kCreateRectRgn(LeftRect %d, TopRect %d, RightRect %d, " "BottomRect %d)\n", LeftRect, TopRect, RightRect, BottomRect); @@ -83,6 +85,8 @@ W32kCreateRectRgn(INT LeftRect, Region->rdh.rcBound = *Rect; return(GDIOBJ_PtrToHandle((PGDIOBJ)Region, 0)); +*/ +return NULL; } HRGN STDCALL diff --git a/reactos/subsys/win32k/objects/text.c b/reactos/subsys/win32k/objects/text.c index 8303ecfac7f..e4f58e2135c 100644 --- a/reactos/subsys/win32k/objects/text.c +++ b/reactos/subsys/win32k/objects/text.c @@ -95,7 +95,7 @@ W32kAddFontResource(LPCWSTR Filename) DbgPrint("could not allocate memory for module"); return 0; } - + // Load driver into memory chunk Status = NtReadFile(FileHandle, 0, 0, 0, &Iosb, buffer, FileStdInfo.EndOfFile.u.LowPart, 0, 0); if (!NT_SUCCESS(Status)) @@ -177,10 +177,10 @@ W32kCreateFont(int Height, logfont.lfClipPrecision = ClipPrecision; logfont.lfQuality = Quality; logfont.lfPitchAndFamily = PitchAndFamily; - + if(Face) memcpy(logfont.lfFaceName, Face, sizeof(logfont.lfFaceName)); - else + else logfont.lfFaceName[0] = '\0'; return W32kCreateFontIndirect(&logfont); @@ -195,15 +195,19 @@ W32kCreateFontIndirect(CONST LPLOGFONT lf) if (lf) { - if(fontPtr = TEXTOBJ_AllocText()) + if(hFont = TEXTOBJ_AllocText()) { - memcpy(&fontPtr->logfont, lf, sizeof(LOGFONT)); + fontPtr = TEXTOBJ_LockText( hFont ); + ASSERT( fontPtr ); //I want to know when this happens + if( fontPtr ){ + memcpy(&fontPtr->logfont, lf, sizeof(LOGFONT)); - if (lf->lfEscapement != lf->lfOrientation) { - /* this should really depend on whether GM_ADVANCED is set */ - fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement; - } - hFont = TEXTOBJ_PtrToHandle(fontPtr); + if (lf->lfEscapement != lf->lfOrientation) { + /* this should really depend on whether GM_ADVANCED is set */ + fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement; + } + TEXTOBJ_UnlockText( hFont ); + } } } @@ -521,34 +525,34 @@ W32kSetTextAlign(HDC hDC, { UINT prevAlign; DC *dc; - + dc = DC_HandleToPtr(hDC); - if (!dc) + if (!dc) { return 0; } prevAlign = dc->w.textAlign; dc->w.textAlign = Mode; - + DC_ReleasePtr( hDC ); return prevAlign; } COLORREF STDCALL -W32kSetTextColor(HDC hDC, +W32kSetTextColor(HDC hDC, COLORREF color) { COLORREF oldColor; PDC dc = DC_HandleToPtr(hDC); - - if (!dc) + + if (!dc) { return 0x80000000; } oldColor = dc->w.textColor; dc->w.textColor = color; - + DC_ReleasePtr( hDC ); return oldColor; } @@ -580,8 +584,8 @@ W32kTextOut(HDC hDC, FT_Bool use_kerning; RECTL DestRect, MaskRect; POINTL SourcePoint, BrushOrigin; - HBRUSH hBrush; - PBRUSHOBJ Brush; + HBRUSH hBrush = NULL; + PBRUSHOBJ Brush = NULL; HBITMAP HSourceGlyph; PSURFOBJ SourceGlyphSurf; SIZEL bitSize; @@ -594,7 +598,10 @@ W32kTextOut(HDC hDC, PPALGDI PalDestGDI; PXLATEOBJ XlateObj; - TextObj = TEXTOBJ_HandleToPtr(dc->w.hFont); + if( !dc ) + return FALSE; + + TextObj = TEXTOBJ_LockText(dc->w.hFont); for(i=0; ilogfont.lfFaceName); - return FALSE; + goto fail; } FontObj = (PFONTOBJ)AccessUserObject(hFont); @@ -635,14 +642,14 @@ W32kTextOut(HDC hDC, error = FT_Set_Pixel_Sizes(face, TextObj->logfont.lfHeight, TextObj->logfont.lfWidth); if(error) { DbgPrint("Error in setting pixel sizes: %u\n", error); - return FALSE; + goto fail; } // Create the brush PalDestGDI = (PPALGDI)AccessInternalObject(dc->w.hPalette); XlateObj = (PXLATEOBJ)EngCreateXlate(PalDestGDI->Mode, PAL_RGB, dc->w.hPalette, NULL); hBrush = W32kCreateSolidBrush(XLATEOBJ_iXlate(XlateObj, dc->w.textColor)); - Brush = BRUSHOBJ_HandleToPtr(hBrush); + Brush = BRUSHOBJ_LockBrush(hBrush); EngDeleteXlate(XlateObj); SourcePoint.x = 0; @@ -655,9 +662,12 @@ W32kTextOut(HDC hDC, // Do we use the current TEXTOBJ's logfont.lfOrientation or the DC's textAlign? if (dc->w.textAlign & TA_BASELINE) { yoff = 0; - } else if (dc->w.textAlign & TA_BOTTOM) { + } + else + if (dc->w.textAlign & TA_BOTTOM) { yoff = -face->size->metrics.descender / 64; - } else { // TA_TOP + } + else { // TA_TOP yoff = face->size->metrics.ascender / 64; } @@ -670,7 +680,7 @@ W32kTextOut(HDC hDC, error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); if(error) { DbgPrint("WARNING: Failed to load and render glyph! [index: %u]\n", glyph_index); - return FALSE; + goto fail; } glyph = face->glyph; @@ -687,7 +697,7 @@ W32kTextOut(HDC hDC, error = FT_Render_Glyph(glyph, ft_render_mode_mono); if(error) { DbgPrint("WARNING: Failed to render glyph!\n"); - return FALSE; + goto fail; } pitch = glyph->bitmap.pitch; } else { @@ -719,12 +729,26 @@ W32kTextOut(HDC hDC, String++; } + TEXTOBJ_UnlockText( dc->w.hFont ); + BRUSHOBJ_UnlockBrush(hBrush); + W32kDeleteObject( hBrush ); + DC_ReleasePtr( hDC ); + return TRUE; + +fail: + TEXTOBJ_UnlockText( dc->w.hFont ); + if( hBrush ){ + BRUSHOBJ_UnlockBrush(hBrush); + W32kDeleteObject( hBrush ); + } + DC_ReleasePtr( hDC ); + return FALSE; } UINT STDCALL W32kTranslateCharsetInfo(PDWORD Src, - LPCHARSETINFO CSI, + LPCHARSETINFO CSI, DWORD Flags) { UNIMPLEMENTED;