From e7651266fd36f92d67f0226700553405668cc97e Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 24 May 2009 04:07:47 +0000 Subject: [PATCH] - Implement GdiConvertAndCheckDC and Abort callback support routine. svn path=/trunk/; revision=41091 --- reactos/dll/win32/gdi32/include/gdi32p.h | 4 ++++ reactos/dll/win32/gdi32/misc/misc.c | 17 +++++++++++++++++ reactos/dll/win32/gdi32/misc/stubs.c | 19 +++++++++++++++---- reactos/include/reactos/win32k/ntgdihdl.h | 1 + 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/gdi32/include/gdi32p.h b/reactos/dll/win32/gdi32/include/gdi32p.h index 723c5657ba2..4504db66d4a 100644 --- a/reactos/dll/win32/gdi32/include/gdi32p.h +++ b/reactos/dll/win32/gdi32/include/gdi32p.h @@ -31,6 +31,8 @@ typedef INT #define METAFILE_MEMORY 1 #define METAFILE_DISK 2 +#define SAPCALLBACKDELAY 244 + /* MACRO ********************************************************************/ #define ROP_USES_SOURCE(Rop) (((Rop) << 2 ^ Rop) & 0xCC0000) @@ -238,4 +240,6 @@ int WINAPI GdiGetBitmapBitsSize(BITMAPINFO *lpbmi); +VOID GdiSAPCallback(PLDC pldc); + /* EOF */ diff --git a/reactos/dll/win32/gdi32/misc/misc.c b/reactos/dll/win32/gdi32/misc/misc.c index 3a3a5ef3541..81d0d07cb9c 100644 --- a/reactos/dll/win32/gdi32/misc/misc.c +++ b/reactos/dll/win32/gdi32/misc/misc.c @@ -164,6 +164,23 @@ PLDC GdiGetLDC(HDC hDC) return Dc_Attr->pvLDC; } +VOID GdiSAPCallback(PLDC pldc) +{ + DWORD Time, NewTime = GetTickCount(); + + Time = NewTime - pldc->CallBackTick; + + if ( Time < SAPCALLBACKDELAY) return; + + pldc->CallBackTick = NewTime; + + if ( pldc->pAbortProc(pldc->hDC, 0) ) + { + CancelDC(pldc->hDC); + AbortDoc(pldc->hDC); + } +} + /* * @implemented */ diff --git a/reactos/dll/win32/gdi32/misc/stubs.c b/reactos/dll/win32/gdi32/misc/stubs.c index 197a149a92a..8cabaa92367 100644 --- a/reactos/dll/win32/gdi32/misc/stubs.c +++ b/reactos/dll/win32/gdi32/misc/stubs.c @@ -1142,15 +1142,26 @@ GdiCleanCacheDC(HDC hdc) } /* - * @unimplemented + * @implemented */ HDC WINAPI GdiConvertAndCheckDC(HDC hdc) { - UNIMPLEMENTED; - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + PLDC pldc; + ULONG hType = GDI_HANDLE_GET_TYPE(hdc); + if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE) + return hdc; + pldc = GdiGetLDC(hdc); + if (pldc) + { + if (pldc->Flags & LDC_SAPCALLBACK) GdiSAPCallback(pldc); + if (pldc->Flags & LDC_KILL_DOCUMENT) return NULL; + if (pldc->Flags & LDC_STARTPAGE) StartPage(hdc); + return hdc; + } + SetLastError(ERROR_INVALID_HANDLE); + return NULL; } /* diff --git a/reactos/include/reactos/win32k/ntgdihdl.h b/reactos/include/reactos/win32k/ntgdihdl.h index 9ca2ed6dbd3..32d9c8ca24c 100644 --- a/reactos/include/reactos/win32k/ntgdihdl.h +++ b/reactos/include/reactos/win32k/ntgdihdl.h @@ -178,6 +178,7 @@ #define LDC_SAPCALLBACK 0x00000020 #define LDC_INIT_DOCUMENT 0x00000040 #define LDC_INIT_PAGE 0x00000080 +#define LDC_STARTPAGE 0x00000100 #define LDC_PLAY_MFDC 0x00000800 #define LDC_CLOCKWISE 0x00002000 #define LDC_KILL_DOCUMENT 0x00010000