Erich Hoover : user32: Prepare for multi-frame storing of icons and cursors .

Alexandre Julliard julliard at winehq.org
Tue Sep 28 11:13:41 CDT 2010


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

Author: Erich Hoover <ehoover at mines.edu>
Date:   Sat Sep 25 21:37:23 2010 -0600

user32: Prepare for multi-frame storing of icons and cursors.

---

 dlls/user32/cursoricon.c |   65 ++++++++++++++++++++++++---------------------
 1 files changed, 35 insertions(+), 30 deletions(-)

diff --git a/dlls/user32/cursoricon.c b/dlls/user32/cursoricon.c
index acae302..043f067 100644
--- a/dlls/user32/cursoricon.c
+++ b/dlls/user32/cursoricon.c
@@ -110,17 +110,22 @@ static CRITICAL_SECTION IconCrst = { &critsect_debug, -1, 0, 0, 0, 0 };
  * User objects management
  */
 
-struct cursoricon_object
+struct cursoricon_frame
 {
-    struct user_object obj;      /* object header */
-    ULONG_PTR          param;    /* opaque param used by 16-bit code */
     HBITMAP            color;    /* color bitmap */
     HBITMAP            alpha;    /* pre-multiplied alpha bitmap for 32-bpp icons */
     HBITMAP            mask;     /* mask bitmap (followed by color for 1-bpp icons) */
-    BOOL               is_icon;  /* whether icon or cursor */
-    UINT               width;
-    UINT               height;
-    POINT              hotspot;
+};
+
+struct cursoricon_object
+{
+    struct user_object      obj;      /* object header */
+    ULONG_PTR               param;    /* opaque param used by 16-bit code */
+    BOOL                    is_icon;  /* whether icon or cursor */
+    UINT                    width;
+    UINT                    height;
+    POINT                   hotspot;
+    struct cursoricon_frame frame;    /* icon frame information */
 };
 
 static HICON alloc_icon_handle(void)
@@ -128,9 +133,9 @@ static HICON alloc_icon_handle(void)
     struct cursoricon_object *obj = HeapAlloc( GetProcessHeap(), 0, sizeof(*obj) );
     if (!obj) return 0;
     obj->param = 0;
-    obj->color = 0;
-    obj->alpha = 0;
-    obj->mask  = 0;
+    obj->frame.color = 0;
+    obj->frame.mask  = 0;
+    obj->frame.alpha  = 0;
     return alloc_user_handle( &obj->obj, USER_ICON );
 }
 
@@ -158,9 +163,9 @@ static BOOL free_icon_handle( HICON handle )
     else if (obj)
     {
         ULONG_PTR param = obj->param;
-        if (obj->color) DeleteObject( obj->color );
-        if (obj->alpha) DeleteObject( obj->alpha );
-        DeleteObject( obj->mask );
+        if (obj->frame.alpha) DeleteObject( obj->frame.alpha );
+        if (obj->frame.color) DeleteObject( obj->frame.color );
+        DeleteObject( obj->frame.mask );
         HeapFree( GetProcessHeap(), 0, obj );
         if (wow_handlers.free_icon_param && param) wow_handlers.free_icon_param( param );
         USER_Driver->pDestroyCursorIcon( handle );
@@ -921,13 +926,13 @@ static HICON CURSORICON_CreateIconFromBMI( BITMAPINFO *bmi,
     {
         struct cursoricon_object *info = get_icon_ptr( hObj );
 
-        info->color   = color;
-        info->mask    = mask;
-        info->alpha   = alpha;
         info->is_icon = bIcon;
         info->hotspot = hotspot;
         info->width   = width;
         info->height  = height;
+        info->frame.color = color;
+        info->frame.mask  = mask;
+        info->frame.alpha = alpha;
         release_icon_ptr( hObj, info );
         USER_Driver->pCreateCursorIcon( hObj );
     }
@@ -1532,13 +1537,13 @@ HICON WINAPI CopyIcon( HICON hIcon )
     if ((hNew = alloc_icon_handle()))
     {
         ptrNew = get_icon_ptr( hNew );
-        ptrNew->color   = copy_bitmap( ptrOld->color );
-        ptrNew->alpha   = copy_bitmap( ptrOld->alpha );
-        ptrNew->mask    = copy_bitmap( ptrOld->mask );
         ptrNew->is_icon = ptrOld->is_icon;
         ptrNew->width   = ptrOld->width;
         ptrNew->height  = ptrOld->height;
         ptrNew->hotspot = ptrOld->hotspot;
+        ptrNew->frame.mask  = copy_bitmap( ptrOld->frame.mask );
+        ptrNew->frame.color = copy_bitmap( ptrOld->frame.color );
+        ptrNew->frame.alpha = copy_bitmap( ptrOld->frame.alpha );
         release_icon_ptr( hNew, ptrNew );
     }
     release_icon_ptr( hIcon, ptrOld );
@@ -1824,8 +1829,8 @@ BOOL WINAPI GetIconInfo(HICON hIcon, PICONINFO iconinfo)
     iconinfo->fIcon    = ptr->is_icon;
     iconinfo->xHotspot = ptr->hotspot.x;
     iconinfo->yHotspot = ptr->hotspot.y;
-    iconinfo->hbmColor = copy_bitmap( ptr->color );
-    iconinfo->hbmMask  = copy_bitmap( ptr->mask );
+    iconinfo->hbmColor = copy_bitmap( ptr->frame.color );
+    iconinfo->hbmMask  = copy_bitmap( ptr->frame.mask );
     release_icon_ptr( hIcon, ptr );
 
     return TRUE;
@@ -1935,12 +1940,12 @@ HICON WINAPI CreateIconIndirect(PICONINFO iconinfo)
     {
         struct cursoricon_object *info = get_icon_ptr( hObj );
 
-        info->color   = color;
-        info->mask    = mask;
-        info->alpha   = create_alpha_bitmap( iconinfo->hbmColor, mask, NULL, NULL );
         info->is_icon = iconinfo->fIcon;
         info->width   = width;
         info->height  = height;
+        info->frame.color = color;
+        info->frame.mask  = mask;
+        info->frame.alpha = create_alpha_bitmap( iconinfo->hbmColor, mask, NULL, NULL );
         if (info->is_icon)
         {
             info->hotspot.x = width / 2;
@@ -2053,7 +2058,7 @@ BOOL WINAPI DrawIconEx( HDC hdc, INT x0, INT y0, HICON hIcon,
     oldFg = SetTextColor( hdc, RGB(0,0,0) );
     oldBg = SetBkColor( hdc, RGB(255,255,255) );
 
-    if (ptr->alpha && (flags & DI_IMAGE))
+    if (ptr->frame.alpha && (flags & DI_IMAGE))
     {
         BOOL is_mono = FALSE;
 
@@ -2066,7 +2071,7 @@ BOOL WINAPI DrawIconEx( HDC hdc, INT x0, INT y0, HICON hIcon,
         if (!is_mono)
         {
             BLENDFUNCTION pixelblend = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
-            SelectObject( hMemDC, ptr->alpha );
+            SelectObject( hMemDC, ptr->frame.alpha );
             if (GdiAlphaBlend( hdc_dest, x, y, cxWidth, cyWidth, hMemDC,
                                0, 0, ptr->width, ptr->height, pixelblend )) goto done;
         }
@@ -2074,24 +2079,24 @@ BOOL WINAPI DrawIconEx( HDC hdc, INT x0, INT y0, HICON hIcon,
 
     if (flags & DI_MASK)
     {
-        SelectObject( hMemDC, ptr->mask );
+        SelectObject( hMemDC, ptr->frame.mask );
         StretchBlt( hdc_dest, x, y, cxWidth, cyWidth,
                     hMemDC, 0, 0, ptr->width, ptr->height, SRCAND );
     }
 
     if (flags & DI_IMAGE)
     {
-        if (ptr->color)
+        if (ptr->frame.color)
         {
             DWORD rop = (flags & DI_MASK) ? SRCINVERT : SRCCOPY;
-            SelectObject( hMemDC, ptr->color );
+            SelectObject( hMemDC, ptr->frame.color );
             StretchBlt( hdc_dest, x, y, cxWidth, cyWidth,
                         hMemDC, 0, 0, ptr->width, ptr->height, rop );
         }
         else
         {
             DWORD rop = (flags & DI_MASK) ? SRCINVERT : SRCCOPY;
-            SelectObject( hMemDC, ptr->mask );
+            SelectObject( hMemDC, ptr->frame.mask );
             StretchBlt( hdc_dest, x, y, cxWidth, cyWidth,
                         hMemDC, 0, ptr->height, ptr->width, ptr->height, rop );
         }




More information about the wine-cvs mailing list