Alexandre Julliard : user32: Implemented UpdateLayeredWindow and UpdateLayeredWindowIndirect.

Alexandre Julliard julliard at winehq.org
Wed Sep 17 07:14:42 CDT 2008


Module: wine
Branch: master
Commit: e4cba25ac74f00ced35de284835ca646d3dd47db
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=e4cba25ac74f00ced35de284835ca646d3dd47db

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Sep 16 16:30:19 2008 +0200

user32: Implemented UpdateLayeredWindow and UpdateLayeredWindowIndirect.

---

 dlls/user32/user32.spec |    1 +
 dlls/user32/win.c       |   81 ++++++++++++++++++++++++++++++++++++++++++-----
 include/winuser.h       |    6 +++
 3 files changed, 80 insertions(+), 8 deletions(-)

diff --git a/dlls/user32/user32.spec b/dlls/user32/user32.spec
index 1c3b538..c9da8ae 100644
--- a/dlls/user32/user32.spec
+++ b/dlls/user32/user32.spec
@@ -727,6 +727,7 @@
 # @ stub UnregisterMessagePumpHook
 # @ stub UnregisterUserApiHook
 @ stdcall UpdateLayeredWindow(long long ptr ptr long ptr long ptr long)
+@ stdcall UpdateLayeredWindowIndirect(long ptr)
 @ stub UpdatePerUserSystemParameters
 @ stdcall UpdateWindow(long)
 @ stdcall User32InitializeImmEntryTable(ptr)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index e1421af..ddea523 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -3368,6 +3368,66 @@ BOOL WINAPI GetLayeredWindowAttributes( HWND hwnd, COLORREF *key, BYTE *alpha, D
     return ret;
 }
 
+
+/*****************************************************************************
+ *              UpdateLayeredWindowIndirect  (USER32.@)
+ */
+BOOL WINAPI UpdateLayeredWindowIndirect( HWND hwnd, const UPDATELAYEREDWINDOWINFO *info )
+{
+    BYTE alpha = 0xff;
+
+    if (!(info->dwFlags & ULW_EX_NORESIZE) && (info->pptDst || info->psize))
+    {
+        int x = 0, y = 0, cx = 0, cy = 0;
+        DWORD flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW | SWP_NOSENDCHANGING;
+
+        if (info->pptDst)
+        {
+            x = info->pptDst->x;
+            y = info->pptDst->y;
+            flags &= ~SWP_NOMOVE;
+        }
+        if (info->psize)
+        {
+            cx = info->psize->cx;
+            cy = info->psize->cy;
+            flags &= ~SWP_NOSIZE;
+        }
+        TRACE( "moving window %p pos %d,%d %dx%x\n", hwnd, x, y, cx, cy );
+        SetWindowPos( hwnd, 0, x, y, cx, cy, flags );
+    }
+
+    if (info->hdcSrc)
+    {
+        RECT rect;
+        HDC hdc = GetDCEx( hwnd, 0, DCX_CACHE );
+
+        if (hdc)
+        {
+            int x = 0, y = 0;
+
+            GetClientRect( hwnd, &rect );
+            if (info->pptSrc)
+            {
+                x = info->pptSrc->x;
+                y = info->pptSrc->y;
+            }
+            /* FIXME: intersect rect with info->prcDirty */
+            TRACE( "copying window %p pos %d,%d\n", hwnd, x, y );
+            BitBlt( hdc, rect.left, rect.top, rect.right, rect.bottom,
+                    info->hdcSrc, rect.left + x, rect.top + y, SRCCOPY );
+            ReleaseDC( hwnd, hdc );
+        }
+    }
+
+    if (info->pblend && !(info->dwFlags & ULW_OPAQUE)) alpha = info->pblend->SourceConstantAlpha;
+    TRACE( "setting window %p alpha %u\n", hwnd, alpha );
+    USER_Driver->pSetLayeredWindowAttributes( hwnd, info->crKey, alpha,
+                                              info->dwFlags & (LWA_ALPHA | LWA_COLORKEY) );
+    return TRUE;
+}
+
+
 /*****************************************************************************
  *              UpdateLayeredWindow (USER32.@)
  */
@@ -3375,14 +3435,19 @@ BOOL WINAPI UpdateLayeredWindow( HWND hwnd, HDC hdcDst, POINT *pptDst, SIZE *psi
                                  HDC hdcSrc, POINT *pptSrc, COLORREF crKey, BLENDFUNCTION *pblend,
                                  DWORD dwFlags)
 {
-    static int once;
-    if (!once)
-    {
-        once = 1;
-        FIXME("(%p,%p,%p,%p,%p,%p,0x%08x,%p,%d): stub!\n",
-              hwnd, hdcDst, pptDst, psize, hdcSrc, pptSrc, crKey, pblend, dwFlags);
-    }
-    return 0;
+    UPDATELAYEREDWINDOWINFO info;
+
+    info.cbSize   = sizeof(info);
+    info.hdcDst   = hdcDst;
+    info.pptDst   = pptDst;
+    info.psize    = psize;
+    info.hdcSrc   = hdcSrc;
+    info.pptSrc   = pptSrc;
+    info.crKey    = crKey;
+    info.pblend   = pblend;
+    info.dwFlags  = dwFlags;
+    info.prcDirty = NULL;
+    return UpdateLayeredWindowIndirect( hwnd, &info );
 }
 
 /* 64bit versions */
diff --git a/include/winuser.h b/include/winuser.h
index c569f31..40bf20a 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -3300,6 +3300,12 @@ typedef struct {
 #define LWA_COLORKEY        0x00000001
 #define LWA_ALPHA           0x00000002
 
+/* UpdateLayeredWindow() flags */
+#define ULW_COLORKEY        0x00000001
+#define ULW_ALPHA           0x00000002
+#define ULW_OPAQUE          0x00000004
+#define ULW_EX_NORESIZE     0x00000008
+
   /* ShowWindow() codes */
 #define SW_HIDE             0
 #define SW_SHOWNORMAL       1




More information about the wine-cvs mailing list