[PATCH 2/2] gdi32/tests: Add 'advanced' test for testing the advanced graphics mode
Ralf Habacker
ralf.habacker at freenet.de
Mon Feb 8 03:27:33 CST 2021
Because drawing simple lines already gives different results than a
native Windows, the comparison of hashes does not work anymore.
Therefore, the advanced test creates bitmap files for each
processed test, which can then be compared visually.
Signed-off-by: Ralf Habacker <ralf.habacker at freenet.de>
---
dlls/gdi32/tests/Makefile.in | 1 +
dlls/gdi32/tests/advanced.c | 186 +++++++++++++++++++++++++++++++++++
2 files changed, 187 insertions(+)
create mode 100644 dlls/gdi32/tests/advanced.c
diff --git a/dlls/gdi32/tests/Makefile.in b/dlls/gdi32/tests/Makefile.in
index ad8f0ce8bad..2cdb1e42e4c 100644
--- a/dlls/gdi32/tests/Makefile.in
+++ b/dlls/gdi32/tests/Makefile.in
@@ -2,6 +2,7 @@ TESTDLL = gdi32.dll
IMPORTS = user32 gdi32 advapi32
C_SRCS = \
+ advanced.c \
bitmap.c \
brush.c \
clipping.c \
diff --git a/dlls/gdi32/tests/advanced.c b/dlls/gdi32/tests/advanced.c
new file mode 100644
index 00000000000..2810d2076d1
--- /dev/null
+++ b/dlls/gdi32/tests/advanced.c
@@ -0,0 +1,186 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <math.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "wincrypt.h"
+#include "mmsystem.h" /* DIBINDEX */
+
+#include "wine/test.h"
+#include "misc.h"
+
+/* Comparing hashes does not work because drawing simple lines is already different from native win32 */
+/* #define WITH_HASH */
+
+typedef struct {
+ HDC dc;
+ BITMAPINFO *bmi;
+ BYTE *bits;
+ HBITMAP dib;
+#ifdef WITH_HASH
+ char *hash_dib;
+#endif
+ char test_name[1024];
+ char save_path[MAX_PATH];
+ char hash_name[1024];
+ RECT bounds;
+ double angle;
+ double shearX;
+} test_data;
+
+static test_data _test_data;
+test_data *td = &_test_data;
+
+double radians ( double d )
+{
+ return d * M_PI / 180;
+}
+
+void set_transform( HDC dc, RECT *bounds, double angle )
+{
+ XFORM xf;
+ double r = radians( angle );
+ xf.eM11 = cos( r ) + sin( r ) * td->shearX;
+ xf.eM22 = cos( r );
+ xf.eM12 = -sin( r );
+ xf.eM21 = sin( r ) + cos( r ) * td->shearX;
+ xf.eDx = ( bounds->right - bounds->left ) / 4;
+ xf.eDy = ( bounds->bottom - bounds->top ) / 4;
+ SetWorldTransform( dc, &xf );
+}
+
+BOOL save_bitmap( test_data *td )
+{
+ return SaveHBITMAPToFile( td->dib, td->save_path );
+}
+
+void init( test_data *td, const char *test_name )
+{
+ sprintf( td->test_name, "%s", test_name );
+ sprintf( td->save_path, "%s-%3.1f-%2.1f.bmp", td->test_name, td->shearX, td->angle );
+ sprintf( td->hash_name, "sha1_advanced_%s_%3.1f_%2.1f", td->test_name, td->shearX, td->angle );
+ trace( "%s\n", td->test_name );
+ reset_bits( td->dc, td->bmi, td->bits );
+ MoveToEx( td->dc, -5, 0, NULL );
+ LineTo( td->dc, 5, 0 );
+ MoveToEx( td->dc, 0, 5, NULL );
+ LineTo( td->dc, 0, -5 );
+}
+
+void check_hash( test_data *td )
+{
+#ifdef WITH_HASH
+ if ( td->hash_dib )
+ HeapFree( GetProcessHeap(), 0, td->hash_dib );
+ td->hash_dib = hash_dib( td->dc, td->bmi, td->bits );
+ printf( "const char *%s = \"%s\";\n", td->hash_name, td->hash_dib );
+#endif
+ // instead we dump the display to a file for visual inspection
+ save_bitmap( td );
+}
+
+static void test_gdi( double angle, double shearX )
+{
+ char bmibuf[sizeof( BITMAPINFO ) + 256 * sizeof( RGBQUAD )];
+ HBITMAP orig_bm;
+ HPALETTE default_palette, old_hpal;
+ RECT r;
+
+ td->bmi = ( BITMAPINFO * )bmibuf;
+ td->dc = CreateCompatibleDC( NULL );
+ td->angle = angle;
+ td->shearX = shearX;
+
+ SetGraphicsMode( td->dc, GM_ADVANCED );
+ set_transform( td->dc, &td->bounds, td->angle );
+
+ memset( td->bmi, 0, sizeof( bmibuf ));
+ td->bmi->bmiHeader.biSize = sizeof( td->bmi->bmiHeader );
+ td->bmi->bmiHeader.biHeight = td->bounds.right;
+ td->bmi->bmiHeader.biWidth = td->bounds.bottom;
+ td->bmi->bmiHeader.biBitCount = 32;
+ td->bmi->bmiHeader.biPlanes = 1;
+ td->bmi->bmiHeader.biCompression = BI_RGB;
+
+ td->dib = CreateDIBSection( 0, td->bmi, DIB_RGB_COLORS, ( void** )&( td->bits ), NULL, 0 );
+ orig_bm = SelectObject( td->dc, td->dib );
+
+ default_palette = create_default_palette( 8 );
+ old_hpal = SelectPalette( td->dc, default_palette, FALSE );
+
+ current_bounds = &td->bounds;
+ SetBoundsRect( td->dc, &td->bounds, DCB_SET );
+
+ SetRect( &r, 0, 0, 128, 128 );
+
+ init( td, "LineTo" );
+ MoveToEx( td->dc, r.left, r.top, NULL );
+ LineTo( td->dc, r.right, r.bottom );
+ check_hash( td );
+
+ init( td, "Rectangle" );
+ ok( Rectangle( td->dc, r.left, r.top, r.right, r.bottom ), td->test_name );
+ check_hash( td );
+
+ init( td, "Ellipse" );
+ ok( Ellipse( td->dc, r.left, r.top, r.right, r.bottom ), td->test_name );
+ check_hash( td );
+
+ init( td, "Arc" );
+ ok( Arc( td->dc, r.left, r.top, r.right, r.bottom, r.left+10, r.top, r.right-10, r.bottom ), td->test_name );
+ check_hash( td );
+
+ init( td, "ArcTo" );
+ ok( ArcTo( td->dc, r.left, r.top, r.right, r.bottom, r.left+10, r.top, r.right-10, r.bottom ), td->test_name );
+ check_hash( td );
+
+ init( td, "Chord" );
+ ok( Chord( td->dc, r.left, r.top, r.right, r.bottom, r.left+10, r.top, r.right-10, r.bottom ), td->test_name );
+ check_hash( td );
+
+ init( td, "Pie" );
+ ok( Pie( td->dc, r.left, r.top, r.right, r.bottom, r.left+10, r.top, r.right-10, r.bottom ), td->test_name );
+ check_hash( td );
+
+ init( td, "FillRect" );
+ ok( FillRect( td->dc, &r, GetStockObject( WHITE_BRUSH )), td->test_name );
+ check_hash( td );
+
+ SelectObject( td->dc, orig_bm );
+ DeleteObject( td->dib );
+ SelectPalette( td->dc, old_hpal, FALSE );
+ DeleteDC( td->dc );
+}
+
+static void test_advanced_graphics( void )
+{
+ td->bounds.left = 0;
+ td->bounds.top = 0;
+ td->bounds.right = 256;
+ td->bounds.bottom = 256;
+
+ test_gdi( 0, 0.0 );
+ test_gdi( 30, 0.0 );
+ test_gdi( 60, 0.0 );
+ test_gdi( 90, 0.0 );
+ test_gdi( 120, 0.0 );
+ test_gdi( 150, 0.0 );
+ test_gdi( 0, 0.1 );
+ test_gdi( 30, 0.1 );
+ test_gdi( 60, 0.1 );
+ test_gdi( 90, 0.1 );
+ test_gdi( 120, 0.1 );
+ test_gdi( 150, 0.1 );
+}
+
+START_TEST( advanced )
+{
+ CryptAcquireContextW( &crypt_prov, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT );
+
+ test_advanced_graphics();
+
+ CryptReleaseContext( crypt_prov, 0 );
+}
--
2.26.2
More information about the wine-devel
mailing list