X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=subsystems%2Fwin32%2Fwin32k%2Fobjects%2Fgdibatch.c;h=c2b5434a6ae6a2807fd506b8c9801b9bff7a1b86;hp=68c758475ae2d62bf428abbd0ab57886d27d20d5;hb=b6edb50eb1a2311af040aadeec7791efa270a72e;hpb=79e9ba171b07100f209c1abca802d015cef7b522 diff --git a/subsystems/win32/win32k/objects/gdibatch.c b/subsystems/win32/win32k/objects/gdibatch.c index 68c758475ae..c2b5434a6ae 100644 --- a/subsystems/win32/win32k/objects/gdibatch.c +++ b/subsystems/win32/win32k/objects/gdibatch.c @@ -19,20 +19,23 @@ VOID FASTCALL DoDeviceSync( SURFOBJ *Surface, PRECTL Rect, FLONG fl) { - PGDIDEVICE Device = (GDIDEVICE*)Surface->hdev; + PPDEVOBJ Device = (PDEVOBJ*)Surface->hdev; // No punting and "Handle to a surface, provided that the surface is device-managed. // Otherwise, dhsurf is zero". if (!(Device->flFlags & PDEV_DRIVER_PUNTED_CALL) && (Surface->dhsurf)) { if (Device->DriverFunctions.SynchronizeSurface) - return Device->DriverFunctions.SynchronizeSurface(Surface, Rect, fl); + { + Device->DriverFunctions.SynchronizeSurface(Surface, Rect, fl); + } else { if (Device->DriverFunctions.Synchronize) - return Device->DriverFunctions.Synchronize(Surface->dhpdev, Rect); + { + Device->DriverFunctions.Synchronize(Surface->dhpdev, Rect); + } } } - return; } VOID @@ -40,7 +43,7 @@ FASTCALL SynchonizeDriver(FLONG Flags) { SURFOBJ *SurfObj; - PGDIDEVICE Device; + PPDEVOBJ Device; if (Flags & GCAPS2_SYNCFLUSH) Flags = DSS_FLUSH_EVENT; @@ -48,8 +51,9 @@ SynchonizeDriver(FLONG Flags) Flags = DSS_TIMER_EVENT; Device = IntEnumHDev(); - - SurfObj = EngLockSurface( Device->pSurface ); +// UNIMPLEMENTED; +//ASSERT(FALSE); + SurfObj = 0;// EngLockSurface( Device->pSurface ); if(!SurfObj) return; DoDeviceSync( SurfObj, NULL, Flags); EngUnlockSurface(SurfObj); @@ -63,14 +67,34 @@ ULONG FASTCALL GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) { - PDC_ATTR Dc_Attr = NULL; + BOOL Hit = FALSE; + ULONG Cmd = 0, Size = 0; + PDC_ATTR pdcattr = NULL; + if (dc) { - Dc_Attr = dc->pDc_Attr; - if (!Dc_Attr) Dc_Attr = &dc->Dc_Attr; + pdcattr = dc->pdcattr; + } + + _SEH2_TRY + { + Cmd = pHdr->Cmd; + Size = pHdr->Size; // Return the full size of the structure. } - // The thread is approaching the end of sunset. - switch(pHdr->Cmd) + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Hit = TRUE; + } + _SEH2_END; + + if (Hit) + { + DPRINT1("WARNING! GdiBatch Fault!\n"); + return 0; + } + + // FYI! The thread is approaching the end of sunset. + switch(Cmd) { case GdiBCPatBlt: // Highest pri first! break; @@ -85,7 +109,7 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) PGDIBSSETBRHORG pgSBO; if(!dc) break; pgSBO = (PGDIBSSETBRHORG) pHdr; - Dc_Attr->ptlBrushOrigin = pgSBO->ptlBrushOrigin; + pdcattr->ptlBrushOrigin = pgSBO->ptlBrushOrigin; break; } case GdiBCExtSelClipRgn: @@ -95,21 +119,22 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) PGDIBSOBJECT pgO; if(!dc) break; pgO = (PGDIBSOBJECT) pHdr; - if(NT_SUCCESS(TextIntRealizeFont((HFONT) pgO->hgdiobj))) - Dc_Attr->hlfntNew = (HFONT) pgO->hgdiobj; + TextIntRealizeFont((HFONT) pgO->hgdiobj, NULL); + pdcattr->ulDirty_ &= ~(DIRTY_CHARSET); } - case GdiBCDelObj: case GdiBCDelRgn: + DPRINT("Delete Region Object!\n"); + case GdiBCDelObj: { PGDIBSOBJECT pgO = (PGDIBSOBJECT) pHdr; - NtGdiDeleteObject( pgO->hgdiobj ); + GreDeleteObject( pgO->hgdiobj ); break; } default: break; } - return pHdr->Size; // Return the full size of the structure. + return Size; } /* @@ -143,8 +168,9 @@ NtGdiFlushUserBatch(VOID) HDC hDC = (HDC) pTeb->GdiTebBatch.HDC; /* If hDC is zero and the buffer fills up with delete objects we need - to run anyway. So, hard code to the system batch limit. */ - if ((hDC) || (GdiBatchCount >= GDI_BATCH_LIMIT)) + to run anyway. + */ + if (hDC || GdiBatchCount) { PCHAR pHdr = (PCHAR)&pTeb->GdiTebBatch.Buffer[0]; PDC pDC = NULL; @@ -157,8 +183,11 @@ NtGdiFlushUserBatch(VOID) // No need to init anything, just go! for (; GdiBatchCount > 0; GdiBatchCount--) { + ULONG Size; // Process Gdi Batch! - pHdr += GdiFlushUserBatch(pDC, (PGDIBATCHHDR) pHdr); + Size = GdiFlushUserBatch(pDC, (PGDIBATCHHDR) pHdr); + if (!Size) break; + pHdr += Size; } if (pDC)