--- /dev/null
+#include "../w32knapi.h"\r
+\r
+W32KAPI\r
+LONG\r
+APIENTRY \r
+NtGdiDoPalette(\r
+ IN HPALETTE hpal,\r
+ IN WORD iStart,\r
+ IN WORD cEntries,\r
+ IN PALETTEENTRY *pPalEntries,\r
+ IN DWORD iFunc,\r
+ IN BOOL bInbound\r
+)\r
+{\r
+ return (LONG)Syscall(L"NtGdiDoPalette", 6, &hpal);\r
+}\r
+\r
+HPALETTE\r
+CreateTestPalette()\r
+{\r
+ struct\r
+ {\r
+ LOGPALETTE logpal;\r
+ PALETTEENTRY entry[5];\r
+ } palstruct = \r
+ { {0x300,5,\r
+ { {1,2,3,0} }},\r
+ { {22,33,44,PC_RESERVED},\r
+ {11,55,77,PC_EXPLICIT},\r
+ {00,77,66,PC_RESERVED | PC_NOCOLLAPSE},\r
+ {12,34,56,78}} };\r
+\r
+ return CreatePalette((LOGPALETTE*)&palstruct);\r
+}\r
+\r
+INT\r
+Test_NtGdiDoPalette_GdiPalAnimate(PTESTINFO pti)\r
+{\r
+ HPALETTE hPal;\r
+ PALETTEENTRY palEntries[5] = {\r
+ {0,0,0,0},\r
+ {0xff,0xff,0xff,0},\r
+ {0x33,0x66,0x99,0},\r
+ {0x25,0x84,0x14,0},\r
+ {0x12,0x34,0x56,0x11}};\r
+ PALETTEENTRY palEntries2[5];\r
+\r
+ /* Test stock palette */\r
+ SetLastError(ERROR_SUCCESS);\r
+ RTEST(NtGdiDoPalette(GetStockObject(DEFAULT_PALETTE), 0, 1, palEntries, GdiPalAnimate, FALSE) == 0);\r
+ RTEST(GetLastError() == ERROR_SUCCESS);\r
+\r
+\r
+ /* Test pEntries = NULL */\r
+ hPal = CreateTestPalette();\r
+ RTEST(NtGdiDoPalette(hPal, 0, 1, NULL, GdiPalAnimate, TRUE) == 0);\r
+ RTEST(NtGdiDoPalette(hPal, 0, 1, NULL, GdiPalAnimate, FALSE) == 0);\r
+ DeleteObject(hPal);\r
+\r
+ /* Test PC_RESERVED */\r
+ hPal = CreateTestPalette();\r
+ RTEST(NtGdiDoPalette(hPal, 0, 5, palEntries, GdiPalAnimate, TRUE) == 2);\r
+ DeleteObject(hPal);\r
+\r
+ hPal = CreateTestPalette();\r
+ RTEST(NtGdiDoPalette(hPal, 1, 5, palEntries, GdiPalAnimate, TRUE) == 2);\r
+ DeleteObject(hPal);\r
+\r
+ hPal = CreateTestPalette();\r
+ RTEST(NtGdiDoPalette(hPal, 2, 5, palEntries, GdiPalAnimate, TRUE) == 1);\r
+ DeleteObject(hPal);\r
+\r
+ hPal = CreateTestPalette();\r
+ RTEST(NtGdiDoPalette(hPal, 3, 5, palEntries, GdiPalAnimate, TRUE) == 1);\r
+ DeleteObject(hPal);\r
+\r
+ hPal = CreateTestPalette();\r
+ RTEST(NtGdiDoPalette(hPal, 4, 5, palEntries, GdiPalAnimate, TRUE) == 0);\r
+ DeleteObject(hPal);\r
+\r
+ hPal = CreateTestPalette();\r
+ RTEST(NtGdiDoPalette(hPal, 5, 5, palEntries, GdiPalAnimate, TRUE) == 0);\r
+ DeleteObject(hPal);\r
+\r
+ hPal = CreateTestPalette();\r
+ RTEST(NtGdiDoPalette(hPal, 0, 5, palEntries, GdiPalAnimate, FALSE) == 2);\r
+ DeleteObject(hPal);\r
+\r
+ hPal = CreateTestPalette();\r
+ RTEST(NtGdiDoPalette(hPal, 3, 5, palEntries, GdiPalAnimate, FALSE) == 1);\r
+ DeleteObject(hPal);\r
+\r
+ /* Test if entries are set correctly */\r
+ hPal = CreateTestPalette();\r
+ NtGdiDoPalette(hPal, 0, 5, palEntries, GdiPalAnimate, TRUE);\r
+ NtGdiDoPalette(hPal, 0, 5, palEntries2, GdiPalGetEntries, FALSE);\r
+ RTEST(palEntries2[0].peRed == 1);\r
+ RTEST(palEntries2[0].peGreen == 2);\r
+ RTEST(palEntries2[0].peBlue == 3);\r
+ RTEST(palEntries2[0].peFlags == 0);\r
+ RTEST(palEntries2[1].peRed == palEntries[1].peRed);\r
+ RTEST(palEntries2[1].peGreen == palEntries[1].peGreen);\r
+ RTEST(palEntries2[1].peBlue == palEntries[1].peBlue);\r
+ RTEST(palEntries2[1].peFlags == palEntries[1].peFlags);\r
+ RTEST(palEntries2[2].peRed == 11);\r
+ RTEST(palEntries2[2].peGreen == 55);\r
+ RTEST(palEntries2[2].peBlue == 77);\r
+ TEST(palEntries2[2].peFlags == PC_EXPLICIT);\r
+ RTEST(palEntries2[3].peRed == palEntries[3].peRed);\r
+ RTEST(palEntries2[3].peGreen == palEntries[3].peGreen);\r
+ RTEST(palEntries2[3].peBlue == palEntries[3].peBlue);\r
+ RTEST(palEntries2[3].peFlags == palEntries[3].peFlags);\r
+ DeleteObject(hPal);\r
+\r
+\r
+ return APISTATUS_NORMAL;\r
+}\r
+\r
+INT\r
+Test_NtGdiDoPalette_GdiPalSetEntries(PTESTINFO pti)\r
+{\r
+ HPALETTE hPal;\r
+ PALETTEENTRY palEntries[5] = {\r
+ {0,0,0,0},\r
+ {0xff,0xff,0xff,0},\r
+ {0x33,0x66,0x99,0},\r
+ {0x25,0x84,0x14,0},\r
+ {0x12,0x34,0x56,0x11}};\r
+ PALETTEENTRY palEntries2[5];\r
+\r
+ hPal = CreateTestPalette();\r
+\r
+ /* Test invalid handle */\r
+ SetLastError(ERROR_SUCCESS);\r
+ RTEST(NtGdiDoPalette((HPALETTE)23, 0, 1, palEntries, GdiPalSetEntries, TRUE) == 0);\r
+ RTEST(GetLastError() == ERROR_SUCCESS);\r
+\r
+ /* Test system palette */\r
+ RTEST(NtGdiDoPalette(GetStockObject(DEFAULT_PALETTE), 0, 1, palEntries, GdiPalSetEntries, TRUE) == 0);\r
+ RTEST(GetLastError() == ERROR_SUCCESS);\r
+\r
+ RTEST(NtGdiDoPalette(hPal, 0, 1, palEntries, GdiPalSetEntries, TRUE) == 1);\r
+ RTEST(NtGdiDoPalette(hPal, 0, 2, palEntries, GdiPalSetEntries, TRUE) == 2);\r
+ RTEST(NtGdiDoPalette(hPal, 0, 3, palEntries, GdiPalSetEntries, TRUE) == 3);\r
+ RTEST(NtGdiDoPalette(hPal, 0, 5, palEntries, GdiPalSetEntries, TRUE) == 5);\r
+ RTEST(NtGdiDoPalette(hPal, 0, 6, palEntries, GdiPalSetEntries, TRUE) == 5);\r
+ RTEST(NtGdiDoPalette(hPal, 3, 6, palEntries, GdiPalSetEntries, TRUE) == 2);\r
+// TEST(NtGdiDoPalette(hPal, 4, 23247, palEntries, GdiPalSetEntries, TRUE) == 0);\r
+\r
+ /* Test bInbound == FALSE */\r
+ NtGdiDoPalette(hPal, 0, 5, palEntries, GdiPalSetEntries, TRUE);\r
+ ZeroMemory(palEntries2, sizeof(palEntries2));\r
+ RTEST(NtGdiDoPalette(hPal, 0, 5, palEntries2, GdiPalSetEntries, FALSE) == 5);\r
+ /* we should get the old values returned in our buffer! */\r
+ TEST(memcmp(palEntries2, palEntries, sizeof(palEntries)) == 0);\r
+\r
+ /* check what we have in our palette now */\r
+ ZeroMemory(palEntries2, sizeof(palEntries2));\r
+ RTEST(NtGdiDoPalette(hPal, 0, 5, palEntries2, GdiPalGetEntries, FALSE) == 5);\r
+ TEST(memcmp(palEntries2, palEntries, sizeof(palEntries)) == 0);\r
+\r
+ RTEST(NtGdiDoPalette(hPal, 0, 4, palEntries2, GdiPalSetEntries, TRUE) == 4);\r
+ RTEST(GetLastError() == ERROR_SUCCESS);\r
+\r
+ /* Test if entries are set correctly */\r
+ hPal = CreateTestPalette();\r
+ NtGdiDoPalette(hPal, 0, 5, palEntries, GdiPalSetEntries, TRUE);\r
+ NtGdiDoPalette(hPal, 0, 5, palEntries2, GdiPalGetEntries, FALSE);\r
+ RTEST(palEntries2[0].peRed == 0);\r
+ RTEST(palEntries2[0].peGreen == 0);\r
+ RTEST(palEntries2[0].peBlue == 0);\r
+ RTEST(palEntries2[0].peFlags == 0);\r
+\r
+ /* Test that the buffer was not changed */\r
+\r
+ /* Test pEntries = NULL */\r
+ RTEST(NtGdiDoPalette(hPal, 0, 1, NULL, GdiPalGetEntries, TRUE) == 0);\r
+\r
+ return APISTATUS_NORMAL;\r
+}\r
+\r
+INT\r
+Test_NtGdiDoPalette_GdiPalGetEntries(PTESTINFO pti)\r
+{\r
+ HPALETTE hPal;\r
+\r
+ hPal = CreateTestPalette();\r
+\r
+ /* Test pEntries = NULL */\r
+ RTEST(NtGdiDoPalette(hPal, 0, 1, NULL, GdiPalGetEntries, TRUE) == 0);\r
+ RTEST(NtGdiDoPalette(hPal, 0, 1, NULL, GdiPalGetEntries, FALSE) == 5);\r
+ RTEST(NtGdiDoPalette(hPal, 2, 1, NULL, GdiPalGetEntries, FALSE) == 5);\r
+ RTEST(NtGdiDoPalette(hPal, 20, 1, NULL, GdiPalGetEntries, FALSE) == 5);\r
+ RTEST(NtGdiDoPalette(hPal, -20, 1, NULL, GdiPalGetEntries, FALSE) == 5);\r
+ RTEST(NtGdiDoPalette(hPal, 2, 0, NULL, GdiPalGetEntries, FALSE) == 5);\r
+\r
+\r
+// Test flags 0xf0\r
+\r
+ return APISTATUS_NORMAL;\r
+}\r
+\r
+INT\r
+Test_NtGdiDoPalette_GetSystemPalette(PTESTINFO pti)\r
+{\r
+ return APISTATUS_NORMAL;\r
+}\r
+\r
+INT\r
+Test_NtGdiDoPalette_GetBIBColorTable(PTESTINFO pti)\r
+{\r
+ return APISTATUS_NORMAL;\r
+}\r
+\r
+INT\r
+Test_NtGdiDoPalette_SetDIBColorTable(PTESTINFO pti)\r
+{\r
+ return APISTATUS_NORMAL;\r
+}\r
+\r
+\r
+INT\r
+Test_NtGdiDoPalette(PTESTINFO pti)\r
+{\r
+ INT ret;\r
+\r
+ ret = Test_NtGdiDoPalette_GdiPalAnimate(pti);\r
+ if (ret != APISTATUS_NORMAL)\r
+ {\r
+ return ret;\r
+ }\r
+\r
+ ret = Test_NtGdiDoPalette_GdiPalSetEntries(pti);\r
+ if (ret != APISTATUS_NORMAL)\r
+ {\r
+ return ret;\r
+ }\r
+\r
+ ret = Test_NtGdiDoPalette_GdiPalGetEntries(pti);\r
+ if (ret != APISTATUS_NORMAL)\r
+ {\r
+ return ret;\r
+ }\r
+\r
+ ret = Test_NtGdiDoPalette_GetSystemPalette(pti);\r
+ if (ret != APISTATUS_NORMAL)\r
+ {\r
+ return ret;\r
+ }\r
+\r
+ ret = Test_NtGdiDoPalette_GetBIBColorTable(pti);\r
+ if (ret != APISTATUS_NORMAL)\r
+ {\r
+ return ret;\r
+ }\r
+\r
+ ret = Test_NtGdiDoPalette_SetDIBColorTable(pti);\r
+ if (ret != APISTATUS_NORMAL)\r
+ {\r
+ return ret;\r
+ }\r
+\r
+ return APISTATUS_NORMAL;\r
+}\r