Implement NtGdiAnimatePalette (partly ripped from Wine)
by hpussin
Modified: trunk/reactos/lib/gdi32/gdi32.def
Modified: trunk/reactos/lib/gdi32/misc/stubs.c
Modified: trunk/reactos/subsys/win32k/objects/color.c
_____
Modified: trunk/reactos/lib/gdi32/gdi32.def
--- trunk/reactos/lib/gdi32/gdi32.def 2005-05-28 12:15:11 UTC (rev
15576)
+++ trunk/reactos/lib/gdi32/gdi32.def 2005-05-28 12:43:26 UTC (rev
15577)
@@ -17,7 +17,7 @@
AddFontResourceW@4
AddFontResourceTracking@8
AngleArc@24
-AnimatePalette@16
+AnimatePalette@16=NtGdiAnimatePalette@16
AnyLinkedFonts@0
Arc@36=NtGdiArc@36
ArcTo@36=NtGdiArcTo@36
_____
Modified: trunk/reactos/lib/gdi32/misc/stubs.c
--- trunk/reactos/lib/gdi32/misc/stubs.c 2005-05-28 12:15:11 UTC
(rev 15576)
+++ trunk/reactos/lib/gdi32/misc/stubs.c 2005-05-28 12:43:26 UTC
(rev 15577)
@@ -13,25 +13,10 @@
#define UNIMPLEMENTED DbgPrint("GDI32: %s is unimplemented, please try
again later.\n", __FUNCTION__);
-/*
- * @unimplemented
- */
-BOOL
-STDCALL
-AnimatePalette(
- HPALETTE a0,
- UINT a1,
- UINT a2,
- CONST PALETTEENTRY *a3
- )
-{
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
-}
+
/*
* @unimplemented
*/
_____
Modified: trunk/reactos/subsys/win32k/objects/color.c
--- trunk/reactos/subsys/win32k/objects/color.c 2005-05-28 12:15:11 UTC
(rev 15576)
+++ trunk/reactos/subsys/win32k/objects/color.c 2005-05-28 12:43:26 UTC
(rev 15577)
@@ -70,12 +70,57 @@
return (const PALETTEENTRY*)&COLOR_sysPalTemplate;
}
-BOOL STDCALL NtGdiAnimatePalette(HPALETTE hPalette, UINT uStartIndex,
- UINT uEntries, CONST PPALETTEENTRY ppe)
+BOOL STDCALL NtGdiAnimatePalette(HPALETTE hPal, UINT StartIndex,
+ UINT NumEntries, CONST PPALETTEENTRY PaletteColors)
{
- UNIMPLEMENTED;
- SetLastWin32Error(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ if( hPal != NtGdiGetStockObject(DEFAULT_PALETTE) )
+ {
+ PPALGDI palPtr;
+ UINT pal_entries;
+ HDC hDC;
+ PDC dc;
+ HWND hHwd;
+ const PALETTEENTRY *pptr = PaletteColors;
+
+ palPtr = (PPALGDI)PALETTE_LockPalette(hPal);
+ if (!palPtr) return FALSE;
+
+ pal_entries = palPtr->NumColors;
+ if (StartIndex >= pal_entries)
+ {
+ PALETTE_UnlockPalette(hPal);
+ return FALSE;
+ }
+ if (StartIndex+NumEntries > pal_entries) NumEntries =
pal_entries - StartIndex;
+
+ for (NumEntries += StartIndex; StartIndex < NumEntries;
StartIndex++, pptr++) {
+ /* According to MSDN, only animate PC_RESERVED colours */
+ if (palPtr->IndexedColors[StartIndex].peFlags & PC_RESERVED)
{
+ memcpy( &palPtr->IndexedColors[StartIndex], pptr,
+ sizeof(PALETTEENTRY) );
+ PALETTE_ValidateFlags(&palPtr->IndexedColors[StartIndex],
1);
+ }
+ }
+
+ PALETTE_UnlockPalette(hPal);
+
+ /* Immediately apply the new palette if current window uses it
*/
+ hHwd = NtUserGetDesktopWindow();
+ hDC = (HDC)NtUserGetWindowDC(hHwd);
+ dc = DC_LockDc(hDC);
+ if (NULL != dc)
+ {
+ if (dc->w.hPalette == hPal)
+ {
+ DC_UnlockDc(hDC);
+ NtGdiRealizePalette(hDC);
+ }
+ else
+ DC_UnlockDc(hDC);
+ }
+ NtUserReleaseDC(hHwd,hDC);
+ }
+ return TRUE;
}
HPALETTE STDCALL NtGdiCreateHalftonePalette(HDC hDC)
Show replies by date