Alexandre Julliard : wineandroid: Implement UpdateLayeredWindow.

Alexandre Julliard julliard at winehq.org
Wed Jun 7 16:24:09 CDT 2017


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jun  7 11:26:57 2017 +0200

wineandroid: Implement UpdateLayeredWindow.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wineandroid.drv/window.c             | 86 +++++++++++++++++++++++++++++++
 dlls/wineandroid.drv/wineandroid.drv.spec |  1 +
 2 files changed, 87 insertions(+)

diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c
index ef849f8..f5d2e4f 100644
--- a/dlls/wineandroid.drv/window.c
+++ b/dlls/wineandroid.drv/window.c
@@ -1056,6 +1056,92 @@ void CDECL ANDROID_SetLayeredWindowAttributes( HWND hwnd, COLORREF key, BYTE alp
 }
 
 
+/*****************************************************************************
+ *           ANDROID_UpdateLayeredWindow
+ */
+BOOL CDECL ANDROID_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWINFO *info,
+                                        const RECT *window_rect )
+{
+    struct window_surface *surface;
+    struct android_win_data *data;
+    BLENDFUNCTION blend = { AC_SRC_OVER, 0, 255, 0 };
+    COLORREF color_key = (info->dwFlags & ULW_COLORKEY) ? info->crKey : CLR_INVALID;
+    char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )];
+    BITMAPINFO *bmi = (BITMAPINFO *)buffer;
+    void *src_bits, *dst_bits;
+    RECT rect;
+    HDC hdc = 0;
+    HBITMAP dib;
+    BOOL ret = FALSE;
+
+    if (!(data = get_win_data( hwnd ))) return FALSE;
+
+    rect = *window_rect;
+    OffsetRect( &rect, -window_rect->left, -window_rect->top );
+
+    surface = data->surface;
+    if (!is_argb_surface( surface ))
+    {
+        if (surface) window_surface_release( surface );
+        surface = NULL;
+    }
+
+    if (!surface || memcmp( &surface->rect, &rect, sizeof(RECT) ))
+    {
+        data->surface = create_surface( data->hwnd, &rect, 255, color_key, TRUE );
+        if (surface) window_surface_release( surface );
+        surface = data->surface;
+    }
+    else set_surface_layered( surface, 255, color_key );
+
+    if (surface) window_surface_add_ref( surface );
+    release_win_data( data );
+
+    if (!surface) return FALSE;
+    if (!info->hdcSrc)
+    {
+        window_surface_release( surface );
+        return TRUE;
+    }
+
+    dst_bits = surface->funcs->get_info( surface, bmi );
+
+    if (!(dib = CreateDIBSection( info->hdcDst, bmi, DIB_RGB_COLORS, &src_bits, NULL, 0 ))) goto done;
+    if (!(hdc = CreateCompatibleDC( 0 ))) goto done;
+
+    SelectObject( hdc, dib );
+
+    surface->funcs->lock( surface );
+
+    if (info->prcDirty)
+    {
+        IntersectRect( &rect, &rect, info->prcDirty );
+        memcpy( src_bits, dst_bits, bmi->bmiHeader.biSizeImage );
+        PatBlt( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, BLACKNESS );
+    }
+    ret = GdiAlphaBlend( hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top,
+                         info->hdcSrc,
+                         rect.left + (info->pptSrc ? info->pptSrc->x : 0),
+                         rect.top + (info->pptSrc ? info->pptSrc->y : 0),
+                         rect.right - rect.left, rect.bottom - rect.top,
+                         (info->dwFlags & ULW_ALPHA) ? *info->pblend : blend );
+    if (ret)
+    {
+        memcpy( dst_bits, src_bits, bmi->bmiHeader.biSizeImage );
+        add_bounds_rect( surface->funcs->get_bounds( surface ), &rect );
+    }
+
+    surface->funcs->unlock( surface );
+    surface->funcs->flush( surface );
+
+done:
+    window_surface_release( surface );
+    if (hdc) DeleteDC( hdc );
+    if (dib) DeleteObject( dib );
+    return ret;
+}
+
+
 /**********************************************************************
  *           ANDROID_WindowMessage
  */
diff --git a/dlls/wineandroid.drv/wineandroid.drv.spec b/dlls/wineandroid.drv/wineandroid.drv.spec
index 8a6e72d..6445bab 100644
--- a/dlls/wineandroid.drv/wineandroid.drv.spec
+++ b/dlls/wineandroid.drv/wineandroid.drv.spec
@@ -12,6 +12,7 @@
 @ cdecl SetLayeredWindowAttributes(long long long long) ANDROID_SetLayeredWindowAttributes
 @ cdecl SetWindowRgn(long long long) ANDROID_SetWindowRgn
 @ cdecl SetWindowStyle(ptr long ptr) ANDROID_SetWindowStyle
+@ cdecl UpdateLayeredWindow(long ptr ptr) ANDROID_UpdateLayeredWindow
 @ cdecl WindowMessage(long long long long) ANDROID_WindowMessage
 @ cdecl WindowPosChanging(long long long ptr ptr ptr ptr) ANDROID_WindowPosChanging
 @ cdecl WindowPosChanged(long long long ptr ptr ptr ptr ptr) ANDROID_WindowPosChanged




More information about the wine-cvs mailing list