From 01f84db1d4671b24e00ba93503d552fb96cb007f Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 7 Apr 2010 00:46:16 +0000 Subject: [PATCH] [Win32k|Gdi32] - Enable font batch and fixed setting brush origion. Use the new delete object functions in win32k. svn path=/trunk/; revision=46758 --- reactos/dll/win32/gdi32/objects/dc.c | 4 +- .../subsystems/win32/win32k/include/coord.h | 4 +- .../subsystems/win32/win32k/include/gdiobj.h | 3 + .../subsystems/win32/win32k/objects/brush.c | 1 + .../subsystems/win32/win32k/objects/coord.c | 10 +++ .../subsystems/win32/win32k/objects/dclife.c | 30 ++------ .../subsystems/win32/win32k/objects/font.c | 68 ++++++++++++------- .../win32/win32k/objects/gdibatch.c | 33 +++++++-- 8 files changed, 98 insertions(+), 55 deletions(-) diff --git a/reactos/dll/win32/gdi32/objects/dc.c b/reactos/dll/win32/gdi32/objects/dc.c index 2d90f60cdac..34c31148bb3 100644 --- a/reactos/dll/win32/gdi32/objects/dc.c +++ b/reactos/dll/win32/gdi32/objects/dc.c @@ -1540,7 +1540,7 @@ SelectObject(HDC hDC, PDC_ATTR pDc_Attr; HGDIOBJ hOldObj = NULL; UINT uType; -// PTEB pTeb; + PTEB pTeb; if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) { @@ -1582,7 +1582,6 @@ SelectObject(HDC hDC, case GDI_OBJECT_TYPE_FONT: hOldObj = pDc_Attr->hlfntNew; if (hOldObj == hGdiObj) return hOldObj; -#if 0 pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS; pDc_Attr->ulDirty_ |= DIRTY_CHARSET; pDc_Attr->hlfntNew = hGdiObj; @@ -1604,7 +1603,6 @@ SelectObject(HDC hDC, if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); return hOldObj; } -#endif // default for select object font return NtGdiSelectFont(hDC, hGdiObj); diff --git a/reactos/subsystems/win32/win32k/include/coord.h b/reactos/subsystems/win32/win32k/include/coord.h index c241b9eb9b6..83f3a355eaa 100644 --- a/reactos/subsystems/win32/win32k/include/coord.h +++ b/reactos/subsystems/win32/win32k/include/coord.h @@ -18,4 +18,6 @@ IntGdiModifyWorldTransform(PDC pDc, DWORD Mode); VOID FASTCALL IntMirrorWindowOrg(PDC); -void FASTCALL IntFixIsotropicMapping(PDC dc); +void FASTCALL IntFixIsotropicMapping(PDC); +LONG FASTCALL IntCalcFillOrigin(PDC); +PPOINTL FASTCALL IntptlBrushOrigin(PDC pdc,LONG,LONG); \ No newline at end of file diff --git a/reactos/subsystems/win32/win32k/include/gdiobj.h b/reactos/subsystems/win32/win32k/include/gdiobj.h index 50ed2e6163f..6b9a7fd8aa8 100644 --- a/reactos/subsystems/win32/win32k/include/gdiobj.h +++ b/reactos/subsystems/win32/win32k/include/gdiobj.h @@ -131,3 +131,6 @@ GDIOBJ_IncrementShareCount(POBJ Object) #endif INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE); + +#define GDIOBJ_GetKernelObj(Handle) \ + ((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData diff --git a/reactos/subsystems/win32/win32k/objects/brush.c b/reactos/subsystems/win32/win32k/objects/brush.c index 6e827fa7bae..f45f6fbcdd4 100644 --- a/reactos/subsystems/win32/win32k/objects/brush.c +++ b/reactos/subsystems/win32/win32k/objects/brush.c @@ -709,6 +709,7 @@ NtGdiSetBrushOrg(HDC hDC, INT XOrg, INT YOrg, LPPOINT Point) pdcattr->ptlBrushOrigin.x = XOrg; pdcattr->ptlBrushOrigin.y = YOrg; + IntptlBrushOrigin(dc, XOrg, YOrg ); DC_UnlockDc(dc); return TRUE; diff --git a/reactos/subsystems/win32/win32k/objects/coord.c b/reactos/subsystems/win32/win32k/objects/coord.c index 6b80f1d463e..0ae25bcc10d 100644 --- a/reactos/subsystems/win32/win32k/objects/coord.c +++ b/reactos/subsystems/win32/win32k/objects/coord.c @@ -1133,6 +1133,16 @@ IntCalcFillOrigin(PDC pdc) return pdc->ptlFillOrigin.y; } +PPOINTL +FASTCALL +IntptlBrushOrigin(PDC pdc, LONG x, LONG y ) +{ + pdc->dclevel.ptlBrushOrigin.x = x; + pdc->dclevel.ptlBrushOrigin.y = y; + IntCalcFillOrigin(pdc); + return &pdc->dclevel.ptlBrushOrigin; +} + VOID APIENTRY GdiSetDCOrg(HDC hDC, LONG Left, LONG Top, PRECTL prc) diff --git a/reactos/subsystems/win32/win32k/objects/dclife.c b/reactos/subsystems/win32/win32k/objects/dclife.c index c64139c9426..1fe51886b2a 100644 --- a/reactos/subsystems/win32/win32k/objects/dclife.c +++ b/reactos/subsystems/win32/win32k/objects/dclife.c @@ -119,6 +119,8 @@ DC_AllocDC(PUNICODE_STRING Driver) pdcattr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT); TextIntRealizeFont(pdcattr->hlfntNew,NULL); + NewDC->hlfntCur = pdcattr->hlfntNew; + NewDC->dclevel.plfnt = GDIOBJ_GetKernelObj(pdcattr->hlfntNew); NewDC->dclevel.hpal = NtGdiGetStockObject(DEFAULT_PALETTE); NewDC->dclevel.ppal = PALETTE_ShareLockPalette(NewDC->dclevel.hpal); @@ -762,34 +764,16 @@ NtGdiCreateCompatibleDC(HDC hDC) BOOL APIENTRY NtGdiDeleteObjectApp(HANDLE DCHandle) -{ - /* Complete all pending operations */ - NtGdiFlushUserBatch(); - - if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE; - - if (GDI_HANDLE_GET_TYPE(DCHandle) != GDI_OBJECT_TYPE_DC) - return GreDeleteObject((HGDIOBJ) DCHandle); - - if (IsObjectDead((HGDIOBJ)DCHandle)) return TRUE; - - if (!GDIOBJ_OwnedByCurrentProcess(DCHandle)) - { - SetLastWin32Error(ERROR_INVALID_HANDLE); - return FALSE; - } - - return IntGdiDeleteDC(DCHandle, FALSE); -} - -BOOL -APIENTRY -NewNtGdiDeleteObjectApp(HANDLE DCHandle) { GDIOBJTYPE ObjType; + /* Complete all pending operations */ + NtGdiFlushUserBatch(); + if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE; + if (IsObjectDead((HGDIOBJ)DCHandle)) return TRUE; + ObjType = GDI_HANDLE_GET_TYPE(DCHandle) >> GDI_ENTRY_UPPER_SHIFT; if (GreGetObjectOwner( DCHandle, ObjType)) diff --git a/reactos/subsystems/win32/win32k/objects/font.c b/reactos/subsystems/win32/win32k/objects/font.c index 41a75cdb43f..6127d835f42 100644 --- a/reactos/subsystems/win32/win32k/objects/font.c +++ b/reactos/subsystems/win32/win32k/objects/font.c @@ -251,6 +251,49 @@ RealizeFontInit(HFONT hFont) return pTextObj; } +HFONT +FASTCALL +GreSelectFont( HDC hDC, HFONT hFont) +{ + PDC pdc; + PDC_ATTR pdcattr; + PTEXTOBJ pOrgFnt, pNewFnt = NULL; + HFONT hOrgFont = NULL; + + if (!hDC || !hFont) return NULL; + + pdc = DC_LockDc(hDC); + if (!pdc) + { + return NULL; + } + + if (NT_SUCCESS(TextIntRealizeFont((HFONT)hFont,NULL))) + { + /* LFONTOBJ use share and locking. */ + pNewFnt = TEXTOBJ_LockText(hFont); + pdcattr = pdc->pdcattr; + pOrgFnt = pdc->dclevel.plfnt; + if (pOrgFnt) + { + hOrgFont = pOrgFnt->BaseObject.hHmgr; + } + else + { + hOrgFont = pdcattr->hlfntNew; + } + pdc->dclevel.plfnt = pNewFnt; + pdc->hlfntCur = hFont; + pdcattr->hlfntNew = hFont; + pdcattr->ulDirty_ |= DIRTY_CHARSET; + pdcattr->ulDirty_ &= ~SLOW_WIDTHS; + } + + if (pNewFnt) TEXTOBJ_UnlockText(pNewFnt); + DC_UnlockDc(pdc); + return hOrgFont; +} + /** Functions ******************************************************************/ INT @@ -933,30 +976,7 @@ NtGdiSelectFont( IN HDC hDC, IN HFONT hFont) { - PDC pDC; - PDC_ATTR pdcattr; - HFONT hOrgFont = NULL; - - if (hDC == NULL || hFont == NULL) return NULL; - - pDC = DC_LockDc(hDC); - if (!pDC) - { - return NULL; - } - - pdcattr = pDC->pdcattr; - - /* FIXME: what if not successful? */ - if(NT_SUCCESS(TextIntRealizeFont((HFONT)hFont,NULL))) - { - hOrgFont = pdcattr->hlfntNew; - pdcattr->hlfntNew = hFont; - } - - DC_UnlockDc(pDC); - - return hOrgFont; + return GreSelectFont(hDC, hFont); } diff --git a/reactos/subsystems/win32/win32k/objects/gdibatch.c b/reactos/subsystems/win32/win32k/objects/gdibatch.c index b958ad4835d..ac174e971fb 100644 --- a/reactos/subsystems/win32/win32k/objects/gdibatch.c +++ b/reactos/subsystems/win32/win32k/objects/gdibatch.c @@ -106,9 +106,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: @@ -116,10 +117,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");