From 833d68c2733aaa20739c5283381ee1b599f11116 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 4 Jun 2008 05:08:46 +0000 Subject: [PATCH] Separate SelectPalette function from User and move it to GDI. svn path=/trunk/; revision=33846 --- .../subsystems/win32/win32k/ntuser/windc.c | 48 ++++--------------- reactos/subsystems/win32/win32k/objects/dc.c | 46 +++++++++++++++++- .../subsystems/win32/win32k/objects/dibobj.c | 4 +- 3 files changed, 57 insertions(+), 41 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/windc.c b/reactos/subsystems/win32/win32k/ntuser/windc.c index 7d48231312f..edaa4a175ed 100644 --- a/reactos/subsystems/win32/win32k/ntuser/windc.c +++ b/reactos/subsystems/win32/win32k/ntuser/windc.c @@ -909,45 +909,17 @@ NtUserGetDC(HWND hWnd) * * \todo implement ForceBackground == TRUE */ -HPALETTE STDCALL NtUserSelectPalette(HDC hDC, - HPALETTE hpal, - BOOL ForceBackground) +HPALETTE +STDCALL +NtUserSelectPalette(HDC hDC, + HPALETTE hpal, + BOOL ForceBackground) { - PDC dc; - HPALETTE oldPal = NULL; - PPALGDI PalGDI; - - // FIXME: mark the palette as a [fore\back]ground pal - dc = DC_LockDc(hDC); - if (!dc) - { - return NULL; - } - - /* Check if this is a valid palette handle */ - PalGDI = PALETTE_LockPalette(hpal); - if (!PalGDI) - { - DC_UnlockDc(dc); - return NULL; - } - - /* Is this a valid palette for this depth? */ - if ((dc->w.bitsPerPixel <= 8 && PalGDI->Mode == PAL_INDEXED) || - (dc->w.bitsPerPixel > 8 && PalGDI->Mode != PAL_INDEXED)) - { - oldPal = dc->DcLevel.hpal; - dc->DcLevel.hpal = hpal; - } - else if (8 < dc->w.bitsPerPixel && PAL_INDEXED == PalGDI->Mode) - { - oldPal = dc->DcLevel.hpal; - dc->DcLevel.hpal = hpal; - } - - PALETTE_UnlockPalette(PalGDI); - DC_UnlockDc(dc); - + HPALETTE oldPal; + UserEnterExclusive(); + // Implement window checks + oldPal = GdiSelectPalette( hDC, hpal, ForceBackground); + UserLeave(); return oldPal; } diff --git a/reactos/subsystems/win32/win32k/objects/dc.c b/reactos/subsystems/win32/win32k/objects/dc.c index 2698e710f42..3dd12d364c7 100644 --- a/reactos/subsystems/win32/win32k/objects/dc.c +++ b/reactos/subsystems/win32/win32k/objects/dc.c @@ -1454,7 +1454,7 @@ IntGdiCopyFromSaveState(PDC dc, PDC dcs, HDC hDC) IntGdiSetBkColor( hDC, sDc_Attr->crBackgroundClr); IntGdiSetTextColor( hDC, sDc_Attr->crForegroundClr); - NtUserSelectPalette( hDC, dcs->DcLevel.hpal, FALSE ); + GdiSelectPalette( hDC, dcs->DcLevel.hpal, FALSE ); #if 0 GDISelectPalette16( hDC, dcs->DcLevel.hpal, FALSE ); @@ -2107,6 +2107,50 @@ NtGdiSelectPen( return hOrgPen; } +HPALETTE +FASTCALL +GdiSelectPalette(HDC hDC, + HPALETTE hpal, + BOOL ForceBackground) +{ + PDC dc; + HPALETTE oldPal = NULL; + PPALGDI PalGDI; + + // FIXME: mark the palette as a [fore\back]ground pal + dc = DC_LockDc(hDC); + if (!dc) + { + return NULL; + } + + /* Check if this is a valid palette handle */ + PalGDI = PALETTE_LockPalette(hpal); + if (!PalGDI) + { + DC_UnlockDc(dc); + return NULL; + } + + /* Is this a valid palette for this depth? */ + if ((dc->w.bitsPerPixel <= 8 && PalGDI->Mode == PAL_INDEXED) || + (dc->w.bitsPerPixel > 8 && PalGDI->Mode != PAL_INDEXED)) + { + oldPal = dc->DcLevel.hpal; + dc->DcLevel.hpal = hpal; + } + else if (8 < dc->w.bitsPerPixel && PAL_INDEXED == PalGDI->Mode) + { + oldPal = dc->DcLevel.hpal; + dc->DcLevel.hpal = hpal; + } + + PALETTE_UnlockPalette(PalGDI); + DC_UnlockDc(dc); + + return oldPal; +} + WORD STDCALL IntGdiSetHookFlags(HDC hDC, WORD Flags) { diff --git a/reactos/subsystems/win32/win32k/objects/dibobj.c b/reactos/subsystems/win32/win32k/objects/dibobj.c index bbc598a2b33..5abc026add4 100644 --- a/reactos/subsystems/win32/win32k/objects/dibobj.c +++ b/reactos/subsystems/win32/win32k/objects/dibobj.c @@ -794,7 +794,7 @@ NtGdiStretchDIBitsInternal( if(Usage == DIB_PAL_COLORS) { hPal = NtGdiGetDCObject(hDC, GDI_OBJECT_TYPE_PALETTE); - hPal = NtUserSelectPalette(hdcMem, hPal, FALSE); + hPal = GdiSelectPalette(hdcMem, hPal, FALSE); } if (BitsInfo->bmiHeader.biCompression == BI_RLE4 || @@ -835,7 +835,7 @@ NtGdiStretchDIBitsInternal( SrcWidth, SrcHeight, ROP, 0); if(hPal) - NtUserSelectPalette(hdcMem, hPal, FALSE); + GdiSelectPalette(hdcMem, hPal, FALSE); NtGdiSelectBitmap(hdcMem, hOldBitmap); NtGdiDeleteObjectApp(hdcMem);