Alexandre Julliard : gdi32: Implement MirrorRgn.
Alexandre Julliard
julliard at winehq.org
Tue Sep 28 11:13:30 CDT 2010
Module: wine
Branch: master
Commit: 97611dca8b2690a4e0cc4df73a481ee899e2e99c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=97611dca8b2690a4e0cc4df73a481ee899e2e99c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Sep 27 20:45:56 2010 +0200
gdi32: Implement MirrorRgn.
---
dlls/gdi32/gdi32.spec | 2 +-
dlls/gdi32/region.c | 21 +++++++++++++++++++++
dlls/user32/tests/win.c | 20 ++++++++++++++++++--
include/wingdi.h | 1 +
4 files changed, 41 insertions(+), 3 deletions(-)
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
index 2855206..4901e13 100644
--- a/dlls/gdi32/gdi32.spec
+++ b/dlls/gdi32/gdi32.spec
@@ -363,7 +363,7 @@
@ stub LoadImageColorMatcherA
@ stub LoadImageColorMatcherW
@ stdcall MaskBlt(long long long long long long long long long long long long)
-# @ stub MirrorRgn
+@ stdcall MirrorRgn(long long)
@ stdcall ModifyWorldTransform(long ptr long)
@ stdcall MoveToEx(long long long ptr)
@ stdcall NamedEscape(long wstr long long ptr long ptr)
diff --git a/dlls/gdi32/region.c b/dlls/gdi32/region.c
index 1f281c4..b37211f 100644
--- a/dlls/gdi32/region.c
+++ b/dlls/gdi32/region.c
@@ -1516,6 +1516,27 @@ INT mirror_region( HRGN dst, HRGN src, INT width )
}
/***********************************************************************
+ * MirrorRgn (GDI32.@)
+ */
+BOOL WINAPI MirrorRgn( HWND hwnd, HRGN hrgn )
+{
+ static const WCHAR user32W[] = {'u','s','e','r','3','2','.','d','l','l',0};
+ static BOOL (WINAPI *pGetWindowRect)( HWND hwnd, LPRECT rect );
+ RECT rect;
+
+ /* yes, a HWND in gdi32, don't ask */
+ if (!pGetWindowRect)
+ {
+ HMODULE user32 = GetModuleHandleW(user32W);
+ if (!user32) return FALSE;
+ if (!(pGetWindowRect = (void *)GetProcAddress( user32, "GetWindowRect" ))) return FALSE;
+ }
+ pGetWindowRect( hwnd, &rect );
+ return mirror_region( hrgn, hrgn, rect.right - rect.left ) != ERROR;
+}
+
+
+/***********************************************************************
* REGION_Coalesce
*
* Attempt to merge the rects in the current band with those in the
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index f34025f..f1f590c 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -58,6 +58,7 @@ static BOOL (WINAPI *pGetProcessDefaultLayout)( DWORD *layout );
static BOOL (WINAPI *pSetProcessDefaultLayout)( DWORD layout );
static DWORD (WINAPI *pSetLayout)(HDC hdc, DWORD layout);
static DWORD (WINAPI *pGetLayout)(HDC hdc);
+static BOOL (WINAPI *pMirrorRgn)(HWND hwnd, HRGN hrgn);
static BOOL test_lbuttondown_flag;
static HWND hwndMessage;
@@ -6126,7 +6127,7 @@ static void test_winregion(void)
{
HWND hwnd;
RECT r;
- int ret;
+ int ret, width;
HRGN hrgn;
if (!pGetWindowRgnBox)
@@ -6159,7 +6160,21 @@ static void test_winregion(void)
ok( r.left == 2 && r.top == 3 && r.right == 10 && r.bottom == 15,
"Expected (2,3,10,15), got (%d,%d,%d,%d)\n", r.left, r.top,
r.right, r.bottom);
- DeleteObject(hrgn);
+ if (pMirrorRgn)
+ {
+ hrgn = CreateRectRgn(2, 3, 10, 15);
+ ret = pMirrorRgn( hwnd, hrgn );
+ ok( ret == TRUE, "MirrorRgn failed %u\n", ret );
+ r.left = r.top = r.right = r.bottom = 0;
+ GetWindowRect( hwnd, &r );
+ width = r.right - r.left;
+ r.left = r.top = r.right = r.bottom = 0;
+ ret = GetRgnBox( hrgn, &r );
+ ok( ret == SIMPLEREGION, "GetRgnBox failed %u\n", ret );
+ ok( r.left == width - 10 && r.top == 3 && r.right == width - 2 && r.bottom == 15,
+ "Wrong rectangle (%d,%d,%d,%d) for width %d\n", r.left, r.top, r.right, r.bottom, width );
+ }
+ else win_skip( "MirrorRgn not supported\n" );
}
DestroyWindow(hwnd);
}
@@ -6220,6 +6235,7 @@ START_TEST(win)
pSetProcessDefaultLayout = (void *)GetProcAddress( user32, "SetProcessDefaultLayout" );
pGetLayout = (void *)GetProcAddress( gdi32, "GetLayout" );
pSetLayout = (void *)GetProcAddress( gdi32, "SetLayout" );
+ pMirrorRgn = (void *)GetProcAddress( gdi32, "MirrorRgn" );
if (!RegisterWindowClasses()) assert(0);
diff --git a/include/wingdi.h b/include/wingdi.h
index fa68c23..e10bbe9 100644
--- a/include/wingdi.h
+++ b/include/wingdi.h
@@ -3601,6 +3601,7 @@ WINGDIAPI BOOL WINAPI LineDDA(INT,INT,INT,INT,LINEDDAPROC,LPARAM);
WINGDIAPI BOOL WINAPI LineTo(HDC,INT,INT);
WINGDIAPI BOOL WINAPI LPtoDP(HDC,LPPOINT,INT);
WINGDIAPI BOOL WINAPI MaskBlt(HDC,INT,INT,INT,INT,HDC,INT,INT,HBITMAP,INT,INT,DWORD);
+WINGDIAPI BOOL WINAPI MirrorRgn(HWND,HRGN);
WINGDIAPI BOOL WINAPI ModifyWorldTransform(HDC,const XFORM *, DWORD);
WINGDIAPI BOOL WINAPI MoveToEx(HDC,INT,INT,LPPOINT);
WINGDIAPI INT WINAPI OffsetClipRgn(HDC,INT,INT);
More information about the wine-cvs
mailing list