Author: cwittich Date: Sat Apr 21 02:36:57 2007 New Revision: 26441
URL: http://svn.reactos.org/svn/reactos?rev=26441&view=rev Log: implement NtGdiGetSystemPaletteEntries (patch by w3seek)
Modified: trunk/reactos/subsystems/win32/win32k/objects/color.c
Modified: trunk/reactos/subsystems/win32/win32k/objects/color.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/obj... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/objects/color.c (original) +++ trunk/reactos/subsystems/win32/win32k/objects/color.c Sat Apr 21 02:36:57 2007 @@ -309,35 +309,77 @@ UINT Entries, LPPALETTEENTRY pe) { - //UINT i; - //PDC dc; -/* - if (!(dc = AccessUserObject(hdc))) return 0; - - if (!pe) - { - Entries = dc->GDIInfo->ulNumPalReg; - goto done; - } - - if (StartIndex >= dc->GDIInfo->ulNumPalReg) - { - Entries = 0; - goto done; - } - - if (StartIndex + Entries >= dc->GDIInfo->ulNumPalReg) Entries = dc->GDIInfo->ulNumPalReg - StartIndex; - - for (i = 0; i < Entries; i++) - { - *(COLORREF*)(entries + i) = COLOR_GetSystemPaletteEntry(StartIndex + i); - } - - done: -// GDI_ReleaseObj(hdc); - return count; */ - // FIXME UNIMPLEMENTED; - return 0; + PPALGDI palGDI = NULL; + PDC dc = NULL; + UINT EntriesSize = 0; + UINT Ret = 0; + + if (Entries == 0) + { + SetLastWin32Error(ERROR_INVALID_PARAMETER); + return 0; + } + + _SEH_TRY + { + if (pe != NULL) + { + EntriesSize = Entries * sizeof(pe[0]); + if (Entries != EntriesSize / sizeof(pe[0])) + { + /* Integer overflow! */ + SetLastWin32Error(ERROR_INVALID_PARAMETER); + _SEH_LEAVE; + } + + ProbeForWrite(pe, + EntriesSize, + sizeof(UINT)); + } + + if (!(dc = DC_LockDc(hDC))) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + _SEH_LEAVE; + } + + palGDI = PALETTE_LockPalette(dc->w.hPalette); + if (palGDI != NULL) + { + if (pe != NULL) + { + UINT CopyEntries; + + if (StartIndex + Entries < palGDI->NumColors) + CopyEntries = StartIndex + Entries; + else + CopyEntries = palGDI->NumColors - StartIndex; + + memcpy(pe, + palGDI->IndexedColors + StartIndex, + CopyEntries * sizeof(pe[0])); + + Ret = CopyEntries; + } + else + { + Ret = dc->GDIInfo->ulNumPalReg; + } + } + } + _SEH_HANDLE + { + SetLastNtError(_SEH_GetExceptionCode()); + } + _SEH_END; + + if (palGDI != NULL) + PALETTE_UnlockPalette(palGDI); + + if (dc != NULL) + DC_UnlockDc(dc); + + return Ret; }
UINT STDCALL NtGdiGetSystemPaletteUse(HDC hDC)