Alexandre Julliard : gdi32/tests: Add some tests for the behavior of a printer DC.
Alexandre Julliard
julliard at winehq.org
Tue Nov 1 13:23:15 CDT 2011
Module: wine
Branch: master
Commit: afd962121ba341a399e8dcef6a60bf059b7f5b10
URL: http://source.winehq.org/git/wine.git/?a=commit;h=afd962121ba341a399e8dcef6a60bf059b7f5b10
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Oct 31 20:23:20 2011 +0100
gdi32/tests: Add some tests for the behavior of a printer DC.
---
dlls/gdi32/tests/dc.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 97 insertions(+), 0 deletions(-)
diff --git a/dlls/gdi32/tests/dc.c b/dlls/gdi32/tests/dc.c
index 2eee7ed..19d417b 100644
--- a/dlls/gdi32/tests/dc.c
+++ b/dlls/gdi32/tests/dc.c
@@ -28,6 +28,7 @@
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"
+#include "winspool.h"
#include "winerror.h"
static DWORD (WINAPI *pSetLayout)(HDC hdc, DWORD layout);
@@ -783,6 +784,101 @@ done:
ReleaseDC(NULL, hdc);
}
+static HDC create_printer_dc(void)
+{
+ char buffer[260];
+ DWORD len;
+ PRINTER_INFO_2A *pbuf = NULL;
+ DRIVER_INFO_3A *dbuf = NULL;
+ HANDLE hprn = 0;
+ HDC hdc = 0;
+ HMODULE winspool = LoadLibraryA( "winspool.drv" );
+ BOOL (WINAPI *pOpenPrinterA)(LPSTR, HANDLE *, LPPRINTER_DEFAULTSA);
+ BOOL (WINAPI *pGetDefaultPrinterA)(LPSTR, LPDWORD);
+ BOOL (WINAPI *pGetPrinterA)(HANDLE, DWORD, LPBYTE, DWORD, LPDWORD);
+ BOOL (WINAPI *pGetPrinterDriverA)(HANDLE, LPSTR, DWORD, LPBYTE, DWORD, LPDWORD);
+ BOOL (WINAPI *pClosePrinter)(HANDLE);
+
+ pGetDefaultPrinterA = (void *)GetProcAddress( winspool, "GetDefaultPrinterA" );
+ pOpenPrinterA = (void *)GetProcAddress( winspool, "OpenPrinterA" );
+ pGetPrinterA = (void *)GetProcAddress( winspool, "GetPrinterA" );
+ pGetPrinterDriverA = (void *)GetProcAddress( winspool, "GetPrinterDriverA" );
+ pClosePrinter = (void *)GetProcAddress( winspool, "ClosePrinter" );
+
+ if (!pGetDefaultPrinterA || !pOpenPrinterA || !pGetPrinterA || !pGetPrinterDriverA || !pClosePrinter)
+ goto done;
+
+ len = sizeof(buffer);
+ if (!pGetDefaultPrinterA( buffer, &len )) goto done;
+ if (!pOpenPrinterA( buffer, &hprn, NULL )) goto done;
+
+ pGetPrinterA( hprn, 2, NULL, 0, &len );
+ pbuf = HeapAlloc( GetProcessHeap(), 0, len );
+ if (!pGetPrinterA( hprn, 2, (LPBYTE)pbuf, len, &len )) goto done;
+
+ pGetPrinterDriverA( hprn, NULL, 3, NULL, 0, &len );
+ dbuf = HeapAlloc( GetProcessHeap(), 0, len );
+ if (!pGetPrinterDriverA( hprn, NULL, 3, (LPBYTE)dbuf, len, &len )) goto done;
+
+ hdc = CreateDCA( dbuf->pDriverPath, pbuf->pPrinterName, pbuf->pPortName, pbuf->pDevMode );
+ trace( "hdc %p for driver '%s' printer '%s' port '%s'\n", hdc,
+ dbuf->pDriverPath, pbuf->pPrinterName, pbuf->pPortName );
+done:
+ HeapFree( GetProcessHeap(), 0, dbuf );
+ HeapFree( GetProcessHeap(), 0, pbuf );
+ if (hprn) pClosePrinter( hprn );
+ if (winspool) FreeLibrary( winspool );
+ if (!hdc) skip( "could not create a DC for the default printer\n" );
+ return hdc;
+}
+
+static void test_printer_dc(void)
+{
+ HDC memdc, display_memdc;
+ HBITMAP orig, bmp;
+ DWORD ret;
+ HDC hdc = create_printer_dc();
+
+ if (!hdc) return;
+
+ memdc = CreateCompatibleDC( hdc );
+ display_memdc = CreateCompatibleDC( 0 );
+
+ ok( memdc != NULL, "CreateCompatibleDC failed for printer\n" );
+ ok( display_memdc != NULL, "CreateCompatibleDC failed for screen\n" );
+
+ ret = GetDeviceCaps( hdc, TECHNOLOGY );
+ ok( ret == DT_RASPRINTER, "wrong type %u\n", ret );
+
+ ret = GetDeviceCaps( memdc, TECHNOLOGY );
+ ok( ret == DT_RASPRINTER, "wrong type %u\n", ret );
+
+ ret = GetDeviceCaps( display_memdc, TECHNOLOGY );
+ ok( ret == DT_RASDISPLAY, "wrong type %u\n", ret );
+
+ bmp = CreateBitmap( 100, 100, 1, GetDeviceCaps( hdc, BITSPIXEL ), NULL );
+ orig = SelectObject( memdc, bmp );
+ ok( orig != NULL, "SelectObject failed\n" );
+ ok( BitBlt( hdc, 10, 10, 20, 20, memdc, 0, 0, SRCCOPY ), "BitBlt failed\n" );
+
+ ok( !SelectObject( display_memdc, bmp ), "SelectObject succeeded\n" );
+ SelectObject( memdc, orig );
+ DeleteObject( bmp );
+
+ bmp = CreateBitmap( 100, 100, 1, 1, NULL );
+ orig = SelectObject( display_memdc, bmp );
+ ok( orig != NULL, "SelectObject failed\n" );
+ ok( !SelectObject( memdc, bmp ), "SelectObject succeeded\n" );
+ ok( BitBlt( hdc, 10, 10, 20, 20, display_memdc, 0, 0, SRCCOPY ), "BitBlt failed\n" );
+ ok( BitBlt( memdc, 10, 10, 20, 20, display_memdc, 0, 0, SRCCOPY ), "BitBlt failed\n" );
+ ok( BitBlt( display_memdc, 10, 10, 20, 20, memdc, 0, 0, SRCCOPY ), "BitBlt failed\n" );
+
+ DeleteDC( memdc );
+ DeleteDC( display_memdc );
+ DeleteDC( hdc );
+ DeleteObject( bmp );
+}
+
START_TEST(dc)
{
pSetLayout = (void *)GetProcAddress( GetModuleHandle("gdi32.dll"), "SetLayout");
@@ -795,4 +891,5 @@ START_TEST(dc)
test_boundsrect();
test_desktop_colorres();
test_gamma();
+ test_printer_dc();
}
More information about the wine-cvs
mailing list