Erich Hoover : winex11: Add support for retrieving multi-rate animated cursor data.

Alexandre Julliard julliard at winehq.org
Thu Mar 10 11:30:27 CST 2011


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

Author: Erich Hoover <ehoover at mines.edu>
Date:   Wed Mar  9 22:56:50 2011 -0700

winex11: Add support for retrieving multi-rate animated cursor data.

---

 dlls/winex11.drv/mouse.c |   37 ++++++++++++++++---------------------
 1 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 6378641..ab500ef 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -294,7 +294,7 @@ static XcursorImage *create_xcursor_frame( HDC hdc, const ICONINFOEXW *iinfo, HA
                                            int width, int height, int istep )
 {
     XcursorImage *image, *ret = NULL;
-    DWORD delay_jiffies, is_static;
+    DWORD delay_jiffies, num_steps;
     int x, y, i, has_alpha;
     XcursorPixel *ptr;
 
@@ -310,12 +310,11 @@ static XcursorImage *create_xcursor_frame( HDC hdc, const ICONINFOEXW *iinfo, HA
     image->xhot = iinfo->xHotspot;
     image->yhot = iinfo->yHotspot;
 
-    /* TODO: Handle animated cursors that use multiple rates */
     image->delay = 100; /* fallback delay, 100 ms */
-    if (GetCursorFrameInfo(icon, 0x0 /* unknown parameter */, 0 /* obtain first rate */, &delay_jiffies, &is_static) != 0)
+    if (GetCursorFrameInfo(icon, 0x0 /* unknown parameter */, istep, &delay_jiffies, &num_steps) != 0)
         image->delay = (100 * delay_jiffies) / 6; /* convert jiffies (1/60s) to milliseconds */
     else
-        WARN("Failed to retrieve animated cursor framerate.\n");
+        WARN("Failed to retrieve animated cursor frame-rate for frame %d.\n", istep);
 
     /* draw the cursor frame to a temporary buffer then copy it into the XcursorImage */
     memset( color_bits, 0x00, color_size );
@@ -366,14 +365,16 @@ static Cursor create_xcursor_cursor( HDC hdc, const ICONINFOEXW *iinfo, HANDLE i
 {
     unsigned char *color_bits, *mask_bits;
     HBITMAP hbmColor = 0, hbmMask = 0;
-    XcursorImage **imgs, *image;
+    DWORD nFrames, delay_jiffies, i;
     int color_size, mask_size;
     BITMAPINFO *info = NULL;
     XcursorImages *images;
+    XcursorImage **imgs;
     Cursor cursor = 0;
-    int nFrames = 0;
 
-    if (!(imgs = HeapAlloc( GetProcessHeap(), 0, sizeof(XcursorImage*) ))) return 0;
+    /* Retrieve the number of frames to render */
+    if (!GetCursorFrameInfo(icon, 0x0 /* unknown parameter */, 0, &delay_jiffies, &nFrames)) return 0;
+    if (!(imgs = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(XcursorImage*)*nFrames ))) return 0;
 
     /* Allocate all of the resources necessary to obtain a cursor frame */
     if (!(info = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( BITMAPINFO, bmiColors[256] )))) goto cleanup;
@@ -406,19 +407,13 @@ static Cursor create_xcursor_cursor( HDC hdc, const ICONINFOEXW *iinfo, HANDLE i
     }
 
     /* Create an XcursorImage for each frame of the cursor */
-    while (1)
+    for (i=0; i<nFrames; i++)
     {
-        XcursorImage **imgstmp;
-
-        image = create_xcursor_frame( hdc, iinfo, icon,
-                                      hbmColor, color_bits, color_size,
-                                      hbmMask, mask_bits, mask_size,
-                                      width, height, nFrames );
-        if (!image) break; /* no more drawable frames */
-
-        imgs[nFrames++] = image;
-        if (!(imgstmp = HeapReAlloc( GetProcessHeap(), 0, imgs, (nFrames+1)*sizeof(XcursorImage*) ))) goto cleanup;
-        imgs = imgstmp;
+        imgs[i] = create_xcursor_frame( hdc, iinfo, icon,
+                                        hbmColor, color_bits, color_size,
+                                        hbmMask, mask_bits, mask_size,
+                                        width, height, i );
+        if (!imgs[i]) goto cleanup;
     }
 
     /* Build an X cursor out of all of the frames */
@@ -436,8 +431,8 @@ cleanup:
     if (imgs)
     {
         /* Failed to produce a cursor, free previously allocated frames */
-        for (nFrames--; nFrames >= 0; nFrames--)
-            pXcursorImageDestroy( imgs[nFrames] );
+        for (i=0; i<nFrames && imgs[i]; i++)
+            pXcursorImageDestroy( imgs[i] );
         HeapFree( GetProcessHeap(), 0, imgs );
     }
     /* Cleanup all of the resources used to obtain the frame data */




More information about the wine-cvs mailing list