* PROGRAMMERS: Timo Kreuzer
*/
-#include <stdio.h>
-#include <wine/test.h>
-#include <windows.h>
+#include <apitest.h>
+
+#include <wingdi.h>
#include <winddi.h>
+#include <winuser.h>
#include <include/ntgdityp.h>
#include <include/ntgdihdl.h>
struct
{
LOGBRUSH logbrush;
- BYTE additional[5];
+ BYTE additional[600];
} TestStruct;
PLOGBRUSH plogbrush;
HBRUSH hBrush;
+ HPEN hpen;
INT ret;
/* Test null pointer and invalid handles */
SetLastError(ERROR_SUCCESS);
ok(GetObjectA(0, 0, NULL) == 0, "\n");
ok(GetObjectA((HANDLE)-1, 0, NULL) == 0, "\n");
+
+ /* Test invalid habdles of different types */
ok(GetObjectA((HANDLE)0x00380000, 0, NULL) == 0, "\n");
ok(GetLastError() == ERROR_SUCCESS, "\n");
ok(GetObjectA((HANDLE)0x00380000, 10, &TestStruct) == 0, "\n");
ok(GetLastError() == ERROR_SUCCESS, "\n");
-
SetLastError(ERROR_SUCCESS);
ok(GetObjectA((HANDLE)0x00010000, 0, NULL) == 0, "\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
SetLastError(ERROR_SUCCESS);
ok(GetObjectA((HANDLE)0x00160000, 0, NULL) == 0, "\n");
ok(GetLastError() == ERROR_SUCCESS, "\n");
-
SetLastError(ERROR_SUCCESS);
ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0, "\n");
ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 1);
//ok(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == 0, "\n"); // fails on win7
- /* Test invalid buffer */
- SetLastError(ERROR_SUCCESS);
- ok(GetObjectA(hBrush, sizeof(LOGBRUSH), (PVOID)0xc0000000) == 0, "\n");
- ok(GetLastError() == ERROR_NOACCESS, "expected ERROR_NOACCESS, got %ld\n", GetLastError());
+ /* Test invalid buffer */
+ SetLastError(0xbadbad00);
+ ok(GetObjectA(GetStockObject(WHITE_BRUSH), sizeof(LOGBRUSH), (PVOID)0xc0000000) == 0, "\n");
+ ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
+ SetLastError(0xbadbad00);
+ ok(GetObjectW(GetStockObject(BLACK_PEN), sizeof(LOGPEN), (PVOID)0xc0000000) == 0, "\n");
+ ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
+ SetLastError(0xbadbad00);
+ ok(GetObjectW(GetStockObject(21), sizeof(BITMAP), (PVOID)0xc0000000) == 0, "\n");
+ ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
+ SetLastError(0xbadbad00);
+ ok(GetObjectW(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), (PVOID)0xc0000000) == 0, "\n");
+ ok(GetLastError() == 0xbadbad00, "wrong error: %ld\n", GetLastError());
SetLastError(ERROR_SUCCESS);
_SEH2_TRY
{
ret = -1;
}
_SEH2_END
-
ok(ret == -1, "should have got an exception\n");
- SetLastError(ERROR_SUCCESS);
- ok(GetObjectW(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), (PVOID)0xc0000000) == 0, "\n");
- ok(GetLastError() == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", GetLastError());
+ ok(GetObjectW(GetStockObject(SYSTEM_FONT), 0x50000000, &TestStruct) == 356, "\n");
+ ok(GetObjectW(GetStockObject(WHITE_BRUSH), 0x50000000, &TestStruct) == sizeof(LOGBRUSH), "\n");
+
+ /* Test buffer size of 0 */
+ SetLastError(0xbadbad00);
+ hBrush = CreateSolidBrush(123);
+ ok(hBrush != NULL, "Failed to create brush\n");
+ ok_long(GetObjectA(hBrush, 0, &TestStruct), sizeof(LOGBRUSH));
+ ok_err(0xbadbad00);
+ DeleteObject(hBrush);
+ SetLastError(0xbadbad00);
+ hpen = CreatePen(PS_SOLID, 1, 123);
+ ok(hpen != NULL, "Failed to create pen\n");
+ ok_long(GetObjectA(hpen, 0, &TestStruct), 0);
+ ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
+ SetLastError(0xbadbad00);
+ TestStruct.logbrush.lbStyle = BS_SOLID;
+ TestStruct.logbrush.lbColor = RGB(1,2,3);
+ TestStruct.logbrush.lbHatch = 0;
+ hpen = ExtCreatePen(PS_GEOMETRIC | PS_SOLID, 1, &TestStruct.logbrush, 0, NULL);
+ ok(hpen != NULL, "Failed to create pen\n");
+ ok_long(GetObjectA(hpen, 0, &TestStruct), 0);
+ ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
+ SetLastError(0xbadbad00);
+ ok(GetObjectW(GetStockObject(SYSTEM_FONT), 0, &TestStruct) == 0, "\n");
+ ok_err(0xbadbad00);
+ SetLastError(0xbadbad00);
+ ok(GetObjectW(GetStockObject(21), 0, &TestStruct) == 0, "\n");
+ ok_err(0xbadbad00);
}
void
Test_Dibsection(void)
{
- BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 9, 1, 8, BI_RGB, 0, 10, 10, 0,0}};
+ BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 9, 1, 16, BI_RGB, 0, 10, 10, 0,0}};
HBITMAP hBitmap;
BITMAP bitmap;
DIBSECTION dibsection;
ok(GetObjectW((HANDLE)((UINT_PTR)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP), "\n");
SetLastError(ERROR_SUCCESS);
- ok(GetObject(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP), "\n");
- ok(GetObject(hBitmap, 0, NULL) == sizeof(BITMAP), "\n");
- ok(GetObject(hBitmap, 5, NULL) == sizeof(BITMAP), "\n");
- ok(GetObject(hBitmap, -5, NULL) == sizeof(BITMAP), "\n");
- ok(GetObject(hBitmap, 0, &dibsection) == 0, "\n");
- ok(GetObject(hBitmap, 5, &dibsection) == 0, "\n");
- ok(GetObject(hBitmap, sizeof(BITMAP), &bitmap) == sizeof(BITMAP), "\n");
- ok(GetObject(hBitmap, sizeof(BITMAP)+2, &bitmap) == sizeof(BITMAP), "\n");
- ok(bitmap.bmType == 0, "\n");
- ok(bitmap.bmWidth == 10, "\n");
- ok(bitmap.bmHeight == 9, "\n");
- ok(bitmap.bmWidthBytes == 12, "\n");
- ok(bitmap.bmPlanes == 1, "\n");
- ok(bitmap.bmBitsPixel == 8, "\n");
+ ok_long(GetObject(hBitmap, sizeof(DIBSECTION), NULL), sizeof(BITMAP));
+ ok_long(GetObject(hBitmap, 0, NULL), sizeof(BITMAP));
+ ok_long(GetObject(hBitmap, 5, NULL), sizeof(BITMAP));
+ ok_long(GetObject(hBitmap, -5, NULL), sizeof(BITMAP));
+ ok_long(GetObject(hBitmap, 0, &dibsection), 0);
+ ok_long(GetObject(hBitmap, 5, &dibsection), 0);
+ ok_long(GetObject(hBitmap, sizeof(BITMAP), &bitmap), sizeof(BITMAP));
+ ok_long(GetObject(hBitmap, sizeof(BITMAP)+2, &bitmap), sizeof(BITMAP));
+ ok_long(bitmap.bmType, 0);
+ ok_long(bitmap.bmWidth, 10);
+ ok_long(bitmap.bmHeight, 9);
+ ok_long(bitmap.bmWidthBytes, 20);
+ ok_long(bitmap.bmPlanes, 1);
+ ok_long(bitmap.bmBitsPixel, 16);
ok(bitmap.bmBits == pData, "\n");
- ok(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(DIBSECTION), "\n");
- ok(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection) == sizeof(DIBSECTION), "\n");
- ok(GetObject(hBitmap, -5, &dibsection) == sizeof(DIBSECTION), "\n");
- ok(GetLastError() == ERROR_SUCCESS, "\n");
+ ok_long(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection), sizeof(DIBSECTION));
+ ok_long(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection), sizeof(DIBSECTION));
+ ok_long(GetObject(hBitmap, -5, &dibsection), sizeof(DIBSECTION));
+ ok_err(ERROR_SUCCESS);
DeleteObject(hBitmap);
ReleaseDC(0, hDC);
}
ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
}
+void
+Test_DIBBrush(void)
+{
+ struct
+ {
+ BITMAPINFOHEADER bmiHeader;
+ WORD wColors[4];
+ BYTE jBuffer[16];
+ } PackedDIB =
+ {
+ {sizeof(BITMAPINFOHEADER), 4, 4, 1, 8, BI_RGB, 0, 1, 1, 4, 0},
+ {1, 7, 3, 1},
+ {0,1,2,3, 1,2,3,0, 2,3,0,1, 3,0,1,2},
+ };
+ LOGBRUSH logbrush;
+ HBRUSH hBrush;
+
+ /* Create a DIB brush */
+ hBrush = CreateDIBPatternBrushPt(&PackedDIB, DIB_PAL_COLORS);
+ ok(hBrush != 0, "CreateSolidBrush failed, skipping tests.\n");
+ if (!hBrush) return;
+
+ FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);
+ SetLastError(ERROR_SUCCESS);
+
+ ok_long(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush), sizeof(LOGBRUSH));
+ ok_long(logbrush.lbStyle, BS_DIBPATTERN);
+ ok_long(logbrush.lbColor, 0);
+ ok_long(logbrush.lbHatch, (ULONG_PTR)&PackedDIB);
+
+ ok_err(ERROR_SUCCESS);
+ DeleteObject(hBrush);
+
+
+ /* Create a DIB brush with undocumented iUsage 2 */
+ hBrush = CreateDIBPatternBrushPt(&PackedDIB, 2);
+ ok(hBrush != 0, "CreateSolidBrush failed, skipping tests.\n");
+ if (!hBrush) return;
+
+ FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);
+ SetLastError(ERROR_SUCCESS);
+
+ ok_long(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush), sizeof(LOGBRUSH));
+ ok_long(logbrush.lbStyle, BS_DIBPATTERN);
+ ok_long(logbrush.lbColor, 0);
+ ok_long(logbrush.lbHatch, (ULONG_PTR)&PackedDIB);
+
+ ok_err(ERROR_SUCCESS);
+ DeleteObject(hBrush);
+
+}
+
void
Test_Pen(void)
{
EXTLOGPEN extlogpen;
DWORD dwStyles[50];
} elpUserStyle;
+ int i;
SetLastError(ERROR_SUCCESS);
ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0, "\n");
ok(GetLastError() == ERROR_SUCCESS, "\n");
ok(GetObject((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0, "\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError());
- SetLastError(ERROR_SUCCESS);
+ SetLastError(0xbadbad00);
ok(GetObject(hPen, 0, &extlogpen) == 0, "\n");
- ok(GetLastError() == ERROR_NOACCESS, "got %ld\n", GetLastError());
+ ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
SetLastError(ERROR_SUCCESS);
ok(GetObject(hPen, 4, &extlogpen) == 0, "\n");
ok(GetLastError() == ERROR_SUCCESS, "got %ld\n", GetLastError());
hPen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 5, &logbrush, 16, (CONST DWORD*)&dwStyles);
ok(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD), "\n");
ok(GetObject(hPen, sizeof(EXTLOGPEN) + 15*sizeof(DWORD), &elpUserStyle) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD), "\n");
- ok(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[0] == 0, "\n");
- ok(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[1] == 1, "\n");
- ok(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[15] == 15, "\n");
+ for (i = 0; i <= 15; i++)
+ ok(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[i] == i, "%d\n", i);
DeleteObject(hPen);
}
ENUMLOGFONTW enumlogfontw;
BYTE bData[270];
} u;
+ int ret;
FillMemory(&u, sizeof(u), 0x77);
hFont = CreateFontA(8, 8, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW), &u.enumlogfontexw) == sizeof(ENUMLOGFONTEXW), "\n"); // 348
ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW) + 1, &u.enumlogfontexw) == sizeof(ENUMLOGFONTEXW) + 1, "\n"); // 348
ok(GetObjectW(hFont, 355, &u.enumlogfontexdvw) == 355, "\n"); // 419
+
ok(GetObjectW(hFont, 356, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 419
+ ret = sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD);
+ ret = GetObjectW(hFont, 357, &u.enumlogfontexdvw);
+ ok(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n");
+ ok(GetObjectW(hFont, 357, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 419
ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW) - 1, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 419
ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW), &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 420
ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW)+1, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 356!
-
- ok(GetObjectW(hFont, 356, &u.bData) == 356, "\n");
- ok(GetObjectW(hFont, 357, &u.bData) == 356, "\n");
ok(GetLastError() == ERROR_SUCCESS, "got %ld\n", GetLastError());
DeleteObject(hFont);
SetLastError(ERROR_SUCCESS);
GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL);
//ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 60, "\n");// FIXME: what structure? fails on win7
- ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "\n");
+ ok_err(ERROR_INSUFFICIENT_BUFFER);
SetLastError(ERROR_SUCCESS);
ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 0, "\n");
- ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "\n");
+ ok_err(ERROR_INSUFFICIENT_BUFFER);
SetLastError(ERROR_SUCCESS);
ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 327, buffer) == 0, "\n");
- ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
+ ok_err(ERROR_INSUFFICIENT_BUFFER);
ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 328, buffer) == 0, "\n");
- ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
+ ok_err(ERROR_INVALID_PARAMETER);
- ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 328, NULL) == 0, "\n");
- //ok(ret == 0, "Expected ... got %d\n", ret);
- ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError());
+ //ok_long(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 328, NULL), 0); // FIXME: fails on WHS
+ //ok_err(ERROR_INSUFFICIENT_BUFFER);
}
void
Test_Dibsection();
Test_Palette();
Test_Brush();
+ Test_DIBBrush();
Test_Pen();
Test_ExtPen(); // not implemented yet in ROS
Test_MetaDC();