Sync to trunk (r46918)
[reactos.git] / subsystems / win32 / win32k / objects / gdibatch.c
index c2b5434..1f0c025 100644 (file)
@@ -107,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:
@@ -117,10 +118,34 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr)
      case GdiBCSelObj:
      {
         PGDIBSOBJECT pgO;
-        if(!dc) break;
+        PTEXTOBJ pOrgFnt, pNewFnt = NULL;
+        HFONT hOrgFont = 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);
+
+           pOrgFnt = dc->dclevel.plfnt;
+           if (pOrgFnt)
+           {
+              hOrgFont = pOrgFnt->BaseObject.hHmgr;
+           }
+           else
+           {
+              hOrgFont = pdcattr->hlfntNew;
+           }
+           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");