-static INT\r
-Test_General(PTESTINFO pti)\r
-{\r
- struct\r
- {\r
- LOGBRUSH logbrush;\r
- BYTE additional[5];\r
- } TestStruct;\r
- PLOGBRUSH plogbrush;\r
- HBRUSH hBrush;\r
-\r
- /* Test null pointer and invalid handles */\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA(0, 0, NULL) == 0);\r
- TEST(GetObjectA((HANDLE)-1, 0, NULL) == 0);\r
- TEST(GetObjectA((HANDLE)0x00380000, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_SUCCESS);\r
-\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-\r
- /* Test need of alignment */\r
- hBrush = GetStockObject(WHITE_BRUSH);\r
- plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush);\r
- TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH));\r
- plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 2);\r
- TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH));\r
- plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 1);\r
- TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == 0);\r
-\r
- return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Bitmap(PTESTINFO pti)\r
-{\r
- HBITMAP hBitmap;\r
- BITMAP bitmap;\r
- DIBSECTION dibsection;\r
- BYTE bData[100] = {0};\r
- BYTE Buffer[100] = {48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0};\r
-\r
- FillMemory(&bitmap, sizeof(BITMAP), 0x77);\r
- hBitmap = CreateBitmap(10,10,1,8,bData);\r
- if (!hBitmap) return FALSE;\r
-\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP));\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP));\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, sizeof(BITMAP), NULL) == sizeof(BITMAP));\r
- TEST(GetObjectA(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));\r
- TEST(GetObjectA(hBitmap, 0, NULL) == sizeof(BITMAP));\r
- TEST(GetObjectA((HANDLE)((UINT)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP));\r
- TEST(GetObjectA(hBitmap, 5, NULL) == sizeof(BITMAP));\r
- TEST(GetObjectA(hBitmap, -5, NULL) == sizeof(BITMAP));\r
- TEST(GetObjectA(hBitmap, 0, Buffer) == 0);\r
- TEST(GetObjectA(hBitmap, 5, Buffer) == 0);\r
- TEST(GetObjectA(hBitmap, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));\r
- TEST(GetObjectA(hBitmap, sizeof(BITMAP)+2, &bitmap) == sizeof(BITMAP));\r
- TEST(GetObjectA(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(BITMAP));\r
- TEST(GetObjectA(hBitmap, -5, &bitmap) == sizeof(BITMAP));\r
- TEST(GetLastError() == ERROR_SUCCESS);\r
-\r
- // todo: test invalid handle + buffer\r
-\r
- DeleteObject(hBitmap);\r
- return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Dibsection(PTESTINFO pti)\r
-{\r
- BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 10, 1, 8, BI_RGB, 0, 10, 10, 0,0}};\r
- HBITMAP hBitmap;\r
- DIBSECTION dibsection;\r
- PVOID pData;\r
-\r
- FillMemory(&dibsection, sizeof(DIBSECTION), 0x77);\r
- HDC hDC = GetDC(0);\r
- hBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, &pData, NULL, 0);\r
- if(!hBitmap) return FALSE;\r
-\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObject(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));\r
- TEST(GetObject(hBitmap, 0, NULL) == sizeof(BITMAP));\r
- TEST(GetObject(hBitmap, 5, NULL) == sizeof(BITMAP));\r
- TEST(GetObject(hBitmap, -5, NULL) == sizeof(BITMAP));\r
- TEST(GetObject(hBitmap, 0, &dibsection) == 0);\r
- TEST(GetObject(hBitmap, 5, &dibsection) == 0);\r
- TEST(GetObject(hBitmap, sizeof(BITMAP), &dibsection) == sizeof(BITMAP));\r
- TEST(GetObject(hBitmap, sizeof(BITMAP)+2, &dibsection) == sizeof(BITMAP));\r
- TEST(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(DIBSECTION));\r
- TEST(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection) == sizeof(DIBSECTION));\r
- TEST(GetObject(hBitmap, -5, &dibsection) == sizeof(DIBSECTION));\r
- TEST(GetLastError() == ERROR_SUCCESS);\r
- DeleteObject(hBitmap);\r
- ReleaseDC(0, hDC);\r
-\r
- return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Palette(PTESTINFO pti)\r
-{\r
- LOGPALETTE logpal;\r
- HPALETTE hPalette;\r
- WORD wPalette;\r
-\r
- FillMemory(&wPalette, sizeof(WORD), 0x77);\r
- logpal.palVersion = 0x0300;\r
- logpal.palNumEntries = 1;\r
- logpal.palPalEntry[0].peRed = 0;\r
- logpal.palPalEntry[0].peGreen = 0;\r
- logpal.palPalEntry[0].peBlue = 0;\r
- logpal.palPalEntry[0].peFlags = PC_EXPLICIT;\r
- hPalette = CreatePalette(&logpal);\r
- if (!hPalette) return FALSE;\r
-\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD));\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD));\r
- TEST(GetObject(hPalette, sizeof(WORD), NULL) == sizeof(WORD));\r
- TEST(GetObject(hPalette, 0, NULL) == sizeof(WORD));\r
- TEST(GetObject(hPalette, 5, NULL) == sizeof(WORD));\r
- TEST(GetObject(hPalette, -5, NULL) == sizeof(WORD));\r
- TEST(GetObject(hPalette, sizeof(WORD), &wPalette) == sizeof(WORD));\r
- TEST(GetObject(hPalette, sizeof(WORD)+2, &wPalette) == sizeof(WORD));\r
- TEST(GetObject(hPalette, 0, &wPalette) == 0);\r
- TEST(GetObject(hPalette, 1, &wPalette) == 0);\r
- TEST(GetObject(hPalette, -1, &wPalette) == sizeof(WORD));\r
- TEST(GetLastError() == ERROR_SUCCESS);\r
- DeleteObject(hPalette);\r
- return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Brush(PTESTINFO pti)\r
-{\r
- LOGBRUSH logbrush;\r
- HBRUSH hBrush;\r
-\r
- FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);\r
- hBrush = CreateSolidBrush(RGB(1,2,3));\r
- if (!hBrush) return FALSE;\r
-\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH));\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH));\r
- TEST(GetObject(hBrush, sizeof(WORD), NULL) == sizeof(LOGBRUSH));\r
- TEST(GetObject(hBrush, 0, NULL) == sizeof(LOGBRUSH));\r
- RTEST(GetObject(hBrush, 5, NULL) == sizeof(LOGBRUSH));\r
- RTEST(GetObject(hBrush, -5, NULL) == sizeof(LOGBRUSH));\r
-\r
- RTEST(GetObject(hBrush, 0, &logbrush) == 0);\r
- RTEST(logbrush.lbStyle == 0x77777777);\r
- RTEST(GetObject(hBrush, 5, &logbrush) == sizeof(LOGBRUSH));\r
- RTEST(logbrush.lbStyle == 0);\r
- RTEST(logbrush.lbColor == 0x77777701);\r
-\r
- RTEST(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush) == sizeof(LOGBRUSH));\r
- RTEST(GetObject(hBrush, sizeof(LOGBRUSH)+2, &logbrush) == sizeof(LOGBRUSH));\r
- RTEST(GetObject(hBrush, -1, &logbrush) == sizeof(LOGBRUSH));\r
- // TODO: test all members\r
-\r
- RTEST(GetLastError() == ERROR_SUCCESS);\r
- DeleteObject(hBrush);\r
- return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Pen(PTESTINFO pti)\r
-{\r
- LOGPEN logpen;\r
- HPEN hPen;\r
-\r
- FillMemory(&logpen, sizeof(LOGPEN), 0x77);\r
- hPen = CreatePen(PS_SOLID, 3, RGB(4,5,6));\r
- if (!hPen) return FALSE;\r
- SetLastError(ERROR_SUCCESS);\r
- RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN));\r
- RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN));\r
- RTEST(GetObject(hPen, sizeof(BITMAP), NULL) == sizeof(LOGPEN));\r
- RTEST(GetObject(hPen, 0, NULL) == sizeof(LOGPEN));\r
- RTEST(GetObject(hPen, 5, NULL) == sizeof(LOGPEN));\r
- RTEST(GetObject(hPen, -5, NULL) == sizeof(LOGPEN));\r
- RTEST(GetObject(hPen, sizeof(LOGPEN), &logpen) == sizeof(LOGPEN));\r
- RTEST(GetObject(hPen, sizeof(LOGPEN)-1, &logpen) == 0);\r
- RTEST(GetObject(hPen, sizeof(LOGPEN)+2, &logpen) == sizeof(LOGPEN));\r
- RTEST(GetObject(hPen, 0, &logpen) == 0);\r
- RTEST(GetObject(hPen, -5, &logpen) == sizeof(LOGPEN));\r
- RTEST(GetLastError() == ERROR_SUCCESS);\r
-\r
- /* test if the fields are filled correctly */\r
- RTEST(logpen.lopnStyle == PS_SOLID);\r
-\r
-\r
- DeleteObject(hPen);\r
- return TRUE;\r
-}\r
-\r
-static INT\r
-Test_ExtPen(PTESTINFO pti)\r
-{\r
- HPEN hPen;\r
- EXTLOGPEN extlogpen;\r
- LOGBRUSH logbrush;\r
- DWORD dwStyles[17] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};\r
- struct\r
- {\r
- EXTLOGPEN extlogpen;\r
- DWORD dwStyles[50];\r
- } elpUserStyle;\r
-\r
- SetLastError(ERROR_SUCCESS);\r
- RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);\r
- RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_PARAMETER);\r
-\r
- FillMemory(&extlogpen, sizeof(EXTLOGPEN), 0x77);\r
- logbrush.lbStyle = BS_SOLID;\r
- logbrush.lbColor = RGB(1,2,3);\r
- logbrush.lbHatch = 22;\r
- hPen = ExtCreatePen(PS_GEOMETRIC | PS_DASH, 5, &logbrush, 0, NULL);\r
-\r
- RTEST(GDI_HANDLE_GET_TYPE(hPen) == GDI_OBJECT_TYPE_EXTPEN);\r
- RTEST(GetObject((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);\r
- RTEST(GetObject(hPen, sizeof(EXTLOGPEN), NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
- RTEST(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
- RTEST(GetObject((HANDLE)GDI_HANDLE_GET_INDEX(hPen), 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
- RTEST(GetObject(hPen, 5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
- RTEST(GetObject(hPen, -5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
- RTEST(GetObject(hPen, 0, &extlogpen) == 0);\r
- RTEST(GetObject(hPen, 4, &extlogpen) == 0);\r
-\r
- /* Nothing should be filled */\r
- RTEST(extlogpen.elpPenStyle == 0x77777777);\r
- RTEST(extlogpen.elpWidth == 0x77777777);\r
-\r
- RTEST(GetObject(hPen, sizeof(EXTLOGPEN), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
- RTEST(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
- RTEST(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD)-1, &extlogpen) == 0);\r
- RTEST(GetObject(hPen, sizeof(EXTLOGPEN)+2, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
- RTEST(GetObject(hPen, -5, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
-\r
- /* test if the fields are filled correctly */\r
- RTEST(extlogpen.elpPenStyle == (PS_GEOMETRIC | PS_DASH));\r
- RTEST(extlogpen.elpWidth == 5);\r
- RTEST(extlogpen.elpBrushStyle == 0);\r
- RTEST(extlogpen.elpColor == RGB(1,2,3));\r
- RTEST(extlogpen.elpHatch == 22);\r
- RTEST(extlogpen.elpNumEntries == 0);\r
- DeleteObject(hPen);\r
-\r
- /* A maximum of 16 Styles is allowed */\r
- hPen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 5, &logbrush, 16, (CONST DWORD*)&dwStyles);\r
- RTEST(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD));\r
- RTEST(GetObject(hPen, sizeof(EXTLOGPEN) + 15*sizeof(DWORD), &elpUserStyle) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD));\r
- RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[0] == 0);\r
- RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[1] == 1);\r
- RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[15] == 15);\r
- DeleteObject(hPen);\r
-\r
- return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Font(PTESTINFO pti)\r
-{\r
- HFONT hFont;\r
- LOGFONTA logfonta;\r
- LOGFONTW logfontw;\r
- EXTLOGFONTA extlogfonta;\r
- EXTLOGFONTW extlogfontw;\r
- ENUMLOGFONTEXA enumlogfontexa;\r
- ENUMLOGFONTEXW enumlogfontexw;\r
- ENUMLOGFONTEXDVA enumlogfontexdva;\r
- ENUMLOGFONTEXDVW enumlogfontexdvw;\r
- ENUMLOGFONTA enumlogfonta;\r
- ENUMLOGFONTW enumlogfontw;\r
- BYTE bData[270];\r
-\r
- FillMemory(&logfonta, sizeof(LOGFONTA), 0x77);\r
- hFont = CreateFontA(8, 8, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,\r
- ANSI_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,\r
- ANTIALIASED_QUALITY, DEFAULT_PITCH, "testfont");\r
- TEST(hFont);\r
-\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTA));\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTW));\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA)); // 60\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTA), NULL) == sizeof(LOGFONTA)); // 156\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXA), NULL) == sizeof(LOGFONTA)); // 188\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTA), NULL) == sizeof(LOGFONTA)); // 192\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA), NULL) == sizeof(LOGFONTA)); // 260\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA)+1, NULL) == sizeof(LOGFONTA)); // 260\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW)); // 92\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTW), NULL) == sizeof(LOGFONTW)); // 284\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTW), NULL) == sizeof(LOGFONTW)); // 320\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXW), NULL) == sizeof(LOGFONTW)); // 348\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW), NULL) == sizeof(LOGFONTW)); // 420\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW)+1, NULL) == sizeof(LOGFONTW)); // 356!\r
-\r
- TEST(GetObjectA(hFont, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA));\r
- TEST(GetObjectA(hFont, 0, NULL) == sizeof(LOGFONTA));\r
- TEST(GetObjectA(hFont, 5, NULL) == sizeof(LOGFONTA));\r
- TEST(GetObjectA(hFont, -5, NULL) == sizeof(LOGFONTA));\r
- TEST(GetObjectA(hFont, 0, &logfonta) == 0);\r
- TEST(logfonta.lfHeight == 0x77777777);\r
-\r
- TEST(GetObjectA(hFont, 5, &logfonta) == 5);\r
- TEST(logfonta.lfHeight == 8);\r
- TEST(logfonta.lfWidth == 0x77777708);\r
-\r
- TEST(GetObjectA(hFont, sizeof(LOGFONTA), &logfonta) == sizeof(LOGFONTA)); // 60\r
- TEST(GetObjectA(hFont, sizeof(LOGFONTW), &logfontw) == sizeof(LOGFONTA)); // 92\r
- TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA), &extlogfonta) == sizeof(EXTLOGFONTA)); // 192\r
- TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA)+1, &extlogfonta) == sizeof(EXTLOGFONTA)+1); // 192\r
- TEST(GetObjectA(hFont, sizeof(EXTLOGFONTW), &extlogfontw) == sizeof(ENUMLOGFONTEXDVA)); // 320\r
-\r
- TEST(GetObjectA(hFont, 261, &bData) == 260); // no\r
-\r
- /* LOGFONT / GetObjectW */\r
- FillMemory(&logfontw, sizeof(LOGFONTW), 0x77);\r
-\r
- TEST(GetObjectW(hFont, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW));\r
- TEST(GetObjectW(hFont, 0, NULL) == sizeof(LOGFONTW));\r
- TEST(GetObjectW(hFont, 5, NULL) == sizeof(LOGFONTW));\r
- TEST(GetObjectW(hFont, -5, NULL) == sizeof(LOGFONTW));\r
- TEST(GetObjectW(hFont, 0, &logfontw) == 0);\r
- TEST(logfontw.lfHeight == 0x77777777);\r
-\r
- TEST(GetObjectW(hFont, 5, &logfontw) == 5);\r
- TEST(logfontw.lfHeight == 8);\r
- TEST(logfontw.lfWidth == 0x77777708);\r
-\r
- TEST(GetObjectA(hFont, sizeof(LOGFONTA), &logfonta) == sizeof(LOGFONTA)); // 60\r
- TEST(logfonta.lfHeight == 8);\r
- TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTA), &enumlogfonta) == sizeof(ENUMLOGFONTA)); // 156\r
- TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXA), &enumlogfontexa) == sizeof(ENUMLOGFONTEXA)); // 188\r
- TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA), &extlogfonta) == sizeof(EXTLOGFONTA)); // 192\r
- TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA), &enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA)); // 260\r
- TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA)+1, &enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA)); // 260\r
-\r
- TEST(GetObjectW(hFont, sizeof(LOGFONTW), &logfontw) == sizeof(LOGFONTW)); // 92\r
- TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTW), &enumlogfontw) == sizeof(ENUMLOGFONTW)); // 284\r
- TEST(GetObjectW(hFont, sizeof(EXTLOGFONTW), &extlogfontw) == sizeof(EXTLOGFONTW)); // 320\r
- TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW), &enumlogfontexw) == sizeof(ENUMLOGFONTEXW)); // 348\r
- TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW), &enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD)); // 420\r
- TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW)+1, &enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD)); // 356!\r
-\r
- TEST(GetObjectW(hFont, 356, &bData) == 356);\r
- TEST(GetLastError() == ERROR_SUCCESS);\r
-\r
- DeleteObject(hFont);\r
-\r
- return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Colorspace(PTESTINFO pti)\r
-{\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 60);// FIXME: what structure?\r
- TEST(GetLastError() == ERROR_INSUFFICIENT_BUFFER);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INSUFFICIENT_BUFFER);\r
-\r
- return TRUE;\r
-}\r
-\r
-static INT\r
-Test_MetaDC(PTESTINFO pti)\r
-{\r
- /* Windows does not SetLastError() on a metadc, but it doesn't seem to do anything with it */\r
- HDC hMetaDC;\r
- BYTE buffer[100];\r
-\r
- hMetaDC = CreateMetaFile(NULL);\r
- if(!hMetaDC) return FALSE;\r
- if(((UINT)hMetaDC & GDI_HANDLE_TYPE_MASK) != GDI_OBJECT_TYPE_METADC) return FALSE;\r
-\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 0, NULL) == 0);\r
- TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 100, &buffer) == 0);\r
- TEST(GetObjectA(hMetaDC, 0, NULL) == 0);\r
- TEST(GetObjectA(hMetaDC, 100, &buffer) == 0);\r
- TEST(GetLastError() == ERROR_SUCCESS);\r
- return TRUE;\r
-}\r
-\r
-INT\r
-Test_GetObject(PTESTINFO pti)\r
-{\r
-\r
- HRGN hRgn;\r
- hRgn = CreateRectRgn(0,0,5,5);\r
- SetLastError(ERROR_SUCCESS);\r
- TEST(GetObjectW(hRgn, 0, NULL) == 0);\r
- TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
- DeleteObject(hRgn);\r
-\r
- Test_Font(pti);\r
- Test_Colorspace(pti);\r
- Test_General(pti);\r
- Test_Bitmap(pti);\r
- Test_Dibsection(pti);\r
- Test_Palette(pti);\r
- Test_Brush(pti);\r
- Test_Pen(pti);\r
- Test_ExtPen(pti); // not implemented yet in ROS\r
- Test_MetaDC(pti);\r
-\r
- return APISTATUS_NORMAL;\r
-}\r
+static INT
+Test_General(PTESTINFO pti)
+{
+ struct
+ {
+ LOGBRUSH logbrush;
+ BYTE additional[5];
+ } TestStruct;
+ PLOGBRUSH plogbrush;
+ HBRUSH hBrush;
+
+ /* Test null pointer and invalid handles */
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA(0, 0, NULL) == 0);
+ TEST(GetObjectA((HANDLE)-1, 0, NULL) == 0);
+ TEST(GetObjectA((HANDLE)0x00380000, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_SUCCESS);
+
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+
+ /* Test need of alignment */
+ hBrush = GetStockObject(WHITE_BRUSH);
+ plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush);
+ TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH));
+ plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 2);
+ TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH));
+ plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 1);
+ TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == 0);
+
+ return TRUE;
+}
+
+static INT
+Test_Bitmap(PTESTINFO pti)
+{
+ HBITMAP hBitmap;
+ BITMAP bitmap;
+ DIBSECTION dibsection;
+ BYTE bData[100] = {0};
+ BYTE Buffer[100] = {48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0};
+
+ FillMemory(&bitmap, sizeof(BITMAP), 0x77);
+ hBitmap = CreateBitmap(10,10,1,8,bData);
+ if (!hBitmap) return FALSE;
+
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP));
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP));
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, sizeof(BITMAP), NULL) == sizeof(BITMAP));
+ TEST(GetObjectA(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));
+ TEST(GetObjectA(hBitmap, 0, NULL) == sizeof(BITMAP));
+ TEST(GetObjectA((HANDLE)((UINT)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP));
+ TEST(GetObjectA(hBitmap, 5, NULL) == sizeof(BITMAP));
+ TEST(GetObjectA(hBitmap, -5, NULL) == sizeof(BITMAP));
+ TEST(GetObjectA(hBitmap, 0, Buffer) == 0);
+ TEST(GetObjectA(hBitmap, 5, Buffer) == 0);
+ TEST(GetObjectA(hBitmap, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
+ TEST(GetObjectA(hBitmap, sizeof(BITMAP)+2, &bitmap) == sizeof(BITMAP));
+ TEST(GetObjectA(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(BITMAP));
+ TEST(GetObjectA(hBitmap, -5, &bitmap) == sizeof(BITMAP));
+ TEST(GetLastError() == ERROR_SUCCESS);
+
+ // todo: test invalid handle + buffer
+
+ DeleteObject(hBitmap);
+ return TRUE;
+}
+
+static INT
+Test_Dibsection(PTESTINFO pti)
+{
+ BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 10, 1, 8, BI_RGB, 0, 10, 10, 0,0}};
+ HBITMAP hBitmap;
+ DIBSECTION dibsection;
+ PVOID pData;
+
+ FillMemory(&dibsection, sizeof(DIBSECTION), 0x77);
+ HDC hDC = GetDC(0);
+ hBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, &pData, NULL, 0);
+ if(!hBitmap) return FALSE;
+
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObject(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));
+ TEST(GetObject(hBitmap, 0, NULL) == sizeof(BITMAP));
+ TEST(GetObject(hBitmap, 5, NULL) == sizeof(BITMAP));
+ TEST(GetObject(hBitmap, -5, NULL) == sizeof(BITMAP));
+ TEST(GetObject(hBitmap, 0, &dibsection) == 0);
+ TEST(GetObject(hBitmap, 5, &dibsection) == 0);
+ TEST(GetObject(hBitmap, sizeof(BITMAP), &dibsection) == sizeof(BITMAP));
+ TEST(GetObject(hBitmap, sizeof(BITMAP)+2, &dibsection) == sizeof(BITMAP));
+ TEST(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(DIBSECTION));
+ TEST(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection) == sizeof(DIBSECTION));
+ TEST(GetObject(hBitmap, -5, &dibsection) == sizeof(DIBSECTION));
+ TEST(GetLastError() == ERROR_SUCCESS);
+ DeleteObject(hBitmap);
+ ReleaseDC(0, hDC);
+
+ return TRUE;
+}
+
+static INT
+Test_Palette(PTESTINFO pti)
+{
+ LOGPALETTE logpal;
+ HPALETTE hPalette;
+ WORD wPalette;
+
+ FillMemory(&wPalette, sizeof(WORD), 0x77);
+ logpal.palVersion = 0x0300;
+ logpal.palNumEntries = 1;
+ logpal.palPalEntry[0].peRed = 0;
+ logpal.palPalEntry[0].peGreen = 0;
+ logpal.palPalEntry[0].peBlue = 0;
+ logpal.palPalEntry[0].peFlags = PC_EXPLICIT;
+ hPalette = CreatePalette(&logpal);
+ if (!hPalette) return FALSE;
+
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD));
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD));
+ TEST(GetObject(hPalette, sizeof(WORD), NULL) == sizeof(WORD));
+ TEST(GetObject(hPalette, 0, NULL) == sizeof(WORD));
+ TEST(GetObject(hPalette, 5, NULL) == sizeof(WORD));
+ TEST(GetObject(hPalette, -5, NULL) == sizeof(WORD));
+ TEST(GetObject(hPalette, sizeof(WORD), &wPalette) == sizeof(WORD));
+ TEST(GetObject(hPalette, sizeof(WORD)+2, &wPalette) == sizeof(WORD));
+ TEST(GetObject(hPalette, 0, &wPalette) == 0);
+ TEST(GetObject(hPalette, 1, &wPalette) == 0);
+ TEST(GetObject(hPalette, -1, &wPalette) == sizeof(WORD));
+ TEST(GetLastError() == ERROR_SUCCESS);
+ DeleteObject(hPalette);
+ return TRUE;
+}
+
+static INT
+Test_Brush(PTESTINFO pti)
+{
+ LOGBRUSH logbrush;
+ HBRUSH hBrush;
+
+ FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);
+ hBrush = CreateSolidBrush(RGB(1,2,3));
+ if (!hBrush) return FALSE;
+
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH));
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH));
+ TEST(GetObject(hBrush, sizeof(WORD), NULL) == sizeof(LOGBRUSH));
+ TEST(GetObject(hBrush, 0, NULL) == sizeof(LOGBRUSH));
+ RTEST(GetObject(hBrush, 5, NULL) == sizeof(LOGBRUSH));
+ RTEST(GetObject(hBrush, -5, NULL) == sizeof(LOGBRUSH));
+
+ RTEST(GetObject(hBrush, 0, &logbrush) == 0);
+ RTEST(logbrush.lbStyle == 0x77777777);
+ RTEST(GetObject(hBrush, 5, &logbrush) == sizeof(LOGBRUSH));
+ RTEST(logbrush.lbStyle == 0);
+ RTEST(logbrush.lbColor == 0x77777701);
+
+ RTEST(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush) == sizeof(LOGBRUSH));
+ RTEST(GetObject(hBrush, sizeof(LOGBRUSH)+2, &logbrush) == sizeof(LOGBRUSH));
+ RTEST(GetObject(hBrush, -1, &logbrush) == sizeof(LOGBRUSH));
+ // TODO: test all members
+
+ RTEST(GetLastError() == ERROR_SUCCESS);
+ DeleteObject(hBrush);
+ return TRUE;
+}
+
+static INT
+Test_Pen(PTESTINFO pti)
+{
+ LOGPEN logpen;
+ HPEN hPen;
+
+ FillMemory(&logpen, sizeof(LOGPEN), 0x77);
+ hPen = CreatePen(PS_SOLID, 3, RGB(4,5,6));
+ if (!hPen) return FALSE;
+ SetLastError(ERROR_SUCCESS);
+ RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN));
+ RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN));
+ RTEST(GetObject(hPen, sizeof(BITMAP), NULL) == sizeof(LOGPEN));
+ RTEST(GetObject(hPen, 0, NULL) == sizeof(LOGPEN));
+ RTEST(GetObject(hPen, 5, NULL) == sizeof(LOGPEN));
+ RTEST(GetObject(hPen, -5, NULL) == sizeof(LOGPEN));
+ RTEST(GetObject(hPen, sizeof(LOGPEN), &logpen) == sizeof(LOGPEN));
+ RTEST(GetObject(hPen, sizeof(LOGPEN)-1, &logpen) == 0);
+ RTEST(GetObject(hPen, sizeof(LOGPEN)+2, &logpen) == sizeof(LOGPEN));
+ RTEST(GetObject(hPen, 0, &logpen) == 0);
+ RTEST(GetObject(hPen, -5, &logpen) == sizeof(LOGPEN));
+ RTEST(GetLastError() == ERROR_SUCCESS);
+
+ /* test if the fields are filled correctly */
+ RTEST(logpen.lopnStyle == PS_SOLID);
+
+
+ DeleteObject(hPen);
+ return TRUE;
+}
+
+static INT
+Test_ExtPen(PTESTINFO pti)
+{
+ HPEN hPen;
+ EXTLOGPEN extlogpen;
+ LOGBRUSH logbrush;
+ DWORD dwStyles[17] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
+ struct
+ {
+ EXTLOGPEN extlogpen;
+ DWORD dwStyles[50];
+ } elpUserStyle;
+
+ SetLastError(ERROR_SUCCESS);
+ RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);
+ RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_PARAMETER);
+
+ FillMemory(&extlogpen, sizeof(EXTLOGPEN), 0x77);
+ logbrush.lbStyle = BS_SOLID;
+ logbrush.lbColor = RGB(1,2,3);
+ logbrush.lbHatch = 22;
+ hPen = ExtCreatePen(PS_GEOMETRIC | PS_DASH, 5, &logbrush, 0, NULL);
+
+ RTEST(GDI_HANDLE_GET_TYPE(hPen) == GDI_OBJECT_TYPE_EXTPEN);
+ RTEST(GetObject((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);
+ RTEST(GetObject(hPen, sizeof(EXTLOGPEN), NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+ RTEST(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+ RTEST(GetObject((HANDLE)GDI_HANDLE_GET_INDEX(hPen), 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+ RTEST(GetObject(hPen, 5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+ RTEST(GetObject(hPen, -5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+ RTEST(GetObject(hPen, 0, &extlogpen) == 0);
+ RTEST(GetObject(hPen, 4, &extlogpen) == 0);
+
+ /* Nothing should be filled */
+ RTEST(extlogpen.elpPenStyle == 0x77777777);
+ RTEST(extlogpen.elpWidth == 0x77777777);
+
+ RTEST(GetObject(hPen, sizeof(EXTLOGPEN), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+ RTEST(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+ RTEST(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD)-1, &extlogpen) == 0);
+ RTEST(GetObject(hPen, sizeof(EXTLOGPEN)+2, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+ RTEST(GetObject(hPen, -5, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+
+ /* test if the fields are filled correctly */
+ RTEST(extlogpen.elpPenStyle == (PS_GEOMETRIC | PS_DASH));
+ RTEST(extlogpen.elpWidth == 5);
+ RTEST(extlogpen.elpBrushStyle == 0);
+ RTEST(extlogpen.elpColor == RGB(1,2,3));
+ RTEST(extlogpen.elpHatch == 22);
+ RTEST(extlogpen.elpNumEntries == 0);
+ DeleteObject(hPen);
+
+ /* A maximum of 16 Styles is allowed */
+ hPen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 5, &logbrush, 16, (CONST DWORD*)&dwStyles);
+ RTEST(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD));
+ RTEST(GetObject(hPen, sizeof(EXTLOGPEN) + 15*sizeof(DWORD), &elpUserStyle) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD));
+ RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[0] == 0);
+ RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[1] == 1);
+ RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[15] == 15);
+ DeleteObject(hPen);
+
+ return TRUE;
+}
+
+static INT
+Test_Font(PTESTINFO pti)
+{
+ HFONT hFont;
+ LOGFONTA logfonta;
+ LOGFONTW logfontw;
+ EXTLOGFONTA extlogfonta;
+ EXTLOGFONTW extlogfontw;
+ ENUMLOGFONTEXA enumlogfontexa;
+ ENUMLOGFONTEXW enumlogfontexw;
+ ENUMLOGFONTEXDVA enumlogfontexdva;
+ ENUMLOGFONTEXDVW enumlogfontexdvw;
+ ENUMLOGFONTA enumlogfonta;
+ ENUMLOGFONTW enumlogfontw;
+ BYTE bData[270];
+
+ FillMemory(&logfonta, sizeof(LOGFONTA), 0x77);
+ hFont = CreateFontA(8, 8, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
+ ANSI_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
+ ANTIALIASED_QUALITY, DEFAULT_PITCH, "testfont");
+ TEST(hFont);
+
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTA));
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTW));
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA)); // 60
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTA), NULL) == sizeof(LOGFONTA)); // 156
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXA), NULL) == sizeof(LOGFONTA)); // 188
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTA), NULL) == sizeof(LOGFONTA)); // 192
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA), NULL) == sizeof(LOGFONTA)); // 260
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA)+1, NULL) == sizeof(LOGFONTA)); // 260
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW)); // 92
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTW), NULL) == sizeof(LOGFONTW)); // 284
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTW), NULL) == sizeof(LOGFONTW)); // 320
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXW), NULL) == sizeof(LOGFONTW)); // 348
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW), NULL) == sizeof(LOGFONTW)); // 420
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW)+1, NULL) == sizeof(LOGFONTW)); // 356!
+
+ TEST(GetObjectA(hFont, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA));
+ TEST(GetObjectA(hFont, 0, NULL) == sizeof(LOGFONTA));
+ TEST(GetObjectA(hFont, 5, NULL) == sizeof(LOGFONTA));
+ TEST(GetObjectA(hFont, -5, NULL) == sizeof(LOGFONTA));
+ TEST(GetObjectA(hFont, 0, &logfonta) == 0);
+ TEST(logfonta.lfHeight == 0x77777777);
+
+ TEST(GetObjectA(hFont, 5, &logfonta) == 5);
+ TEST(logfonta.lfHeight == 8);
+ TEST(logfonta.lfWidth == 0x77777708);
+
+ TEST(GetObjectA(hFont, sizeof(LOGFONTA), &logfonta) == sizeof(LOGFONTA)); // 60
+ TEST(GetObjectA(hFont, sizeof(LOGFONTW), &logfontw) == sizeof(LOGFONTA)); // 92
+ TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA), &extlogfonta) == sizeof(EXTLOGFONTA)); // 192
+ TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA)+1, &extlogfonta) == sizeof(EXTLOGFONTA)+1); // 192
+ TEST(GetObjectA(hFont, sizeof(EXTLOGFONTW), &extlogfontw) == sizeof(ENUMLOGFONTEXDVA)); // 320
+
+ TEST(GetObjectA(hFont, 261, &bData) == 260); // no
+
+ /* LOGFONT / GetObjectW */
+ FillMemory(&logfontw, sizeof(LOGFONTW), 0x77);
+
+ TEST(GetObjectW(hFont, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW));
+ TEST(GetObjectW(hFont, 0, NULL) == sizeof(LOGFONTW));
+ TEST(GetObjectW(hFont, 5, NULL) == sizeof(LOGFONTW));
+ TEST(GetObjectW(hFont, -5, NULL) == sizeof(LOGFONTW));
+ TEST(GetObjectW(hFont, 0, &logfontw) == 0);
+ TEST(logfontw.lfHeight == 0x77777777);
+
+ TEST(GetObjectW(hFont, 5, &logfontw) == 5);
+ TEST(logfontw.lfHeight == 8);
+ TEST(logfontw.lfWidth == 0x77777708);
+
+ TEST(GetObjectA(hFont, sizeof(LOGFONTA), &logfonta) == sizeof(LOGFONTA)); // 60
+ TEST(logfonta.lfHeight == 8);
+ TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTA), &enumlogfonta) == sizeof(ENUMLOGFONTA)); // 156
+ TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXA), &enumlogfontexa) == sizeof(ENUMLOGFONTEXA)); // 188
+ TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA), &extlogfonta) == sizeof(EXTLOGFONTA)); // 192
+ TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA), &enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA)); // 260
+ TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA)+1, &enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA)); // 260
+
+ TEST(GetObjectW(hFont, sizeof(LOGFONTW), &logfontw) == sizeof(LOGFONTW)); // 92
+ TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTW), &enumlogfontw) == sizeof(ENUMLOGFONTW)); // 284
+ TEST(GetObjectW(hFont, sizeof(EXTLOGFONTW), &extlogfontw) == sizeof(EXTLOGFONTW)); // 320
+ TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW), &enumlogfontexw) == sizeof(ENUMLOGFONTEXW)); // 348
+ TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW), &enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD)); // 420
+ TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW)+1, &enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD)); // 356!
+
+ TEST(GetObjectW(hFont, 356, &bData) == 356);
+ TEST(GetLastError() == ERROR_SUCCESS);
+
+ DeleteObject(hFont);
+
+ return TRUE;
+}
+
+static INT
+Test_Colorspace(PTESTINFO pti)
+{
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 60);// FIXME: what structure?
+ TEST(GetLastError() == ERROR_INSUFFICIENT_BUFFER);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INSUFFICIENT_BUFFER);
+
+ return TRUE;
+}
+
+static INT
+Test_MetaDC(PTESTINFO pti)
+{
+ /* Windows does not SetLastError() on a metadc, but it doesn't seem to do anything with it */
+ HDC hMetaDC;
+ BYTE buffer[100];
+
+ hMetaDC = CreateMetaFile(NULL);
+ if(!hMetaDC) return FALSE;
+ if(((UINT)hMetaDC & GDI_HANDLE_TYPE_MASK) != GDI_OBJECT_TYPE_METADC) return FALSE;
+
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 0, NULL) == 0);
+ TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 100, &buffer) == 0);
+ TEST(GetObjectA(hMetaDC, 0, NULL) == 0);
+ TEST(GetObjectA(hMetaDC, 100, &buffer) == 0);
+ TEST(GetLastError() == ERROR_SUCCESS);
+ return TRUE;
+}
+
+INT
+Test_GetObject(PTESTINFO pti)
+{
+
+ HRGN hRgn;
+ hRgn = CreateRectRgn(0,0,5,5);
+ SetLastError(ERROR_SUCCESS);
+ TEST(GetObjectW(hRgn, 0, NULL) == 0);
+ TEST(GetLastError() == ERROR_INVALID_HANDLE);
+ DeleteObject(hRgn);
+
+ Test_Font(pti);
+ Test_Colorspace(pti);
+ Test_General(pti);
+ Test_Bitmap(pti);
+ Test_Dibsection(pti);
+ Test_Palette(pti);
+ Test_Brush(pti);
+ Test_Pen(pti);
+ Test_ExtPen(pti); // not implemented yet in ROS
+ Test_MetaDC(pti);
+
+ return APISTATUS_NORMAL;
+}