[YAROTOWS] Reintegrate the branch. For a brighter future.
[reactos.git] / reactos / subsystems / win32 / win32k / objects / gdibatch.c
index bbc36ff..7ddb1fa 100644 (file)
@@ -1,5 +1,5 @@
 
-#include <w32k.h>
+#include <win32k.h>
 
 #define NDEBUG
 #include <debug.h>
@@ -51,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);
@@ -66,14 +67,34 @@ ULONG
 FASTCALL
 GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
 {
+  BOOL Hit = FALSE;
+  ULONG Cmd = 0, Size = 0;
   PDC_ATTR pdcattr = NULL;
 
   if (dc)
   {
-    pdcattr = dc->pdcattr;
+     pdcattr = dc->pdcattr;
+  }
+
+  _SEH2_TRY
+  {
+     Cmd = pHdr->Cmd;
+     Size = pHdr->Size; // Return the full size of the structure.
   }
+  _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(pHdr->Cmd)
+  switch(Cmd)
   {
      case GdiBCPatBlt: // Highest pri first!
         break;
@@ -86,9 +107,10 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
      case GdiBCSetBrushOrg:
      {
         PGDIBSSETBRHORG pgSBO;
-        if(!dc) break;
+        if (!dc) break;
         pgSBO = (PGDIBSSETBRHORG) pHdr;
         pdcattr->ptlBrushOrigin = pgSBO->ptlBrushOrigin;
+        IntptlBrushOrigin(dc, pgSBO->ptlBrushOrigin.x, pgSBO->ptlBrushOrigin.y);
         break;
      }
      case GdiBCExtSelClipRgn:
@@ -96,10 +118,24 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
      case GdiBCSelObj:
      {
         PGDIBSOBJECT pgO;
-        if(!dc) break;
+        PTEXTOBJ pNewFnt = NULL;
+
+        if (!dc) break;
         pgO = (PGDIBSOBJECT) pHdr;
-        TextIntRealizeFont((HFONT) pgO->hgdiobj, NULL);
-        pdcattr->ulDirty_ &= ~(DIRTY_CHARSET);
+
+        if (NT_SUCCESS(TextIntRealizeFont((HFONT)pgO->hgdiobj,NULL)))
+        {
+           /* LFONTOBJ use share and locking. */
+           pNewFnt = TEXTOBJ_LockText(pgO->hgdiobj);
+
+           dc->dclevel.plfnt = pNewFnt;
+           dc->hlfntCur = pgO->hgdiobj;
+           pdcattr->hlfntNew = pgO->hgdiobj;
+           pdcattr->ulDirty_ |= DIRTY_CHARSET;
+           pdcattr->ulDirty_ &= ~SLOW_WIDTHS;
+        }
+        if (pNewFnt) TEXTOBJ_UnlockText(pNewFnt);
+        break;
      }
      case GdiBCDelRgn:
         DPRINT("Delete Region Object!\n");
@@ -113,7 +149,7 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
         break;
   }
 
-  return pHdr->Size; // Return the full size of the structure.
+  return Size; 
 }
 
 /*
@@ -139,7 +175,6 @@ NTSTATUS
 APIENTRY
 NtGdiFlushUserBatch(VOID)
 {
-  BOOL Hit;
   PTEB pTeb = NtCurrentTeb();
   ULONG GdiBatchCount = pTeb->GdiBatchCount;
 
@@ -161,28 +196,13 @@ NtGdiFlushUserBatch(VOID)
       }
 
        // No need to init anything, just go!
-       for (Hit = FALSE; GdiBatchCount > 0; GdiBatchCount--)
-       {   /*
-              Looks like a hack,
-              feels like a hack,
-              you're right it's a hack,
-              due to the lack,
-              of kernel thread locking when it is in sunset!
-            */
-           _SEH2_TRY
-           {
-              ((PGDIBATCHHDR)pHdr)->Cmd = ((PGDIBATCHHDR)pHdr)->Cmd;
-           }
-           _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
-           {
-              Hit = TRUE;
-           }
-           _SEH2_END;
-
-           if (Hit) break;
-
+       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)