Alexandre Julliard : user: Added fast 32->16 mapping for WM_COMPARE/DELETE/ MEASURE/DRAWITEM.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 26 13:54:58 CDT 2006


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May 26 13:54:57 2006 +0200

user: Added fast 32->16 mapping for WM_COMPARE/DELETE/MEASURE/DRAWITEM.

---

 dlls/user/winproc.c |  146 ++++++++++++++++++++++++---------------------------
 1 files changed, 69 insertions(+), 77 deletions(-)

diff --git a/dlls/user/winproc.c b/dlls/user/winproc.c
index 5114fe8..33ecab6 100644
--- a/dlls/user/winproc.c
+++ b/dlls/user/winproc.c
@@ -974,70 +974,6 @@ static INT WINPROC_MapMsg32ATo16( HWND h
         *plparam = MAKELPARAM( (HWND16)*plparam,
                                (WORD)msg32 - WM_CTLCOLORMSGBOX );
         return 0;
-    case WM_COMPAREITEM:
-        {
-            COMPAREITEMSTRUCT *cis32 = (COMPAREITEMSTRUCT *)*plparam;
-            COMPAREITEMSTRUCT16 *cis = HeapAlloc( GetProcessHeap(), 0, sizeof(COMPAREITEMSTRUCT16));
-            if (!cis) return -1;
-            cis->CtlType    = (UINT16)cis32->CtlType;
-            cis->CtlID      = (UINT16)cis32->CtlID;
-            cis->hwndItem   = HWND_16( cis32->hwndItem );
-            cis->itemID1    = (UINT16)cis32->itemID1;
-            cis->itemData1  = cis32->itemData1;
-            cis->itemID2    = (UINT16)cis32->itemID2;
-            cis->itemData2  = cis32->itemData2;
-            *plparam = MapLS( cis );
-        }
-        return 1;
-    case WM_DELETEITEM:
-        {
-            DELETEITEMSTRUCT *dis32 = (DELETEITEMSTRUCT *)*plparam;
-            DELETEITEMSTRUCT16 *dis = HeapAlloc( GetProcessHeap(), 0, sizeof(DELETEITEMSTRUCT16) );
-            if (!dis) return -1;
-            dis->CtlType  = (UINT16)dis32->CtlType;
-            dis->CtlID    = (UINT16)dis32->CtlID;
-            dis->itemID   = (UINT16)dis32->itemID;
-            dis->hwndItem = (dis->CtlType == ODT_MENU) ? (HWND16)LOWORD(dis32->hwndItem)
-                                                       : HWND_16( dis32->hwndItem );
-            dis->itemData = dis32->itemData;
-            *plparam = MapLS( dis );
-        }
-        return 1;
-    case WM_DRAWITEM:
-        {
-            DRAWITEMSTRUCT *dis32 = (DRAWITEMSTRUCT *)*plparam;
-            DRAWITEMSTRUCT16 *dis = HeapAlloc( GetProcessHeap(), 0, sizeof(DRAWITEMSTRUCT16) );
-            if (!dis) return -1;
-            dis->CtlType       = (UINT16)dis32->CtlType;
-            dis->CtlID         = (UINT16)dis32->CtlID;
-            dis->itemID        = (UINT16)dis32->itemID;
-            dis->itemAction    = (UINT16)dis32->itemAction;
-            dis->itemState     = (UINT16)dis32->itemState;
-            dis->hwndItem      = HWND_16( dis32->hwndItem );
-            dis->hDC           = HDC_16(dis32->hDC);
-            dis->itemData      = dis32->itemData;
-            dis->rcItem.left   = dis32->rcItem.left;
-            dis->rcItem.top    = dis32->rcItem.top;
-            dis->rcItem.right  = dis32->rcItem.right;
-            dis->rcItem.bottom = dis32->rcItem.bottom;
-            *plparam = MapLS( dis );
-        }
-        return 1;
-    case WM_MEASUREITEM:
-        {
-            MEASUREITEMSTRUCT *mis32 = (MEASUREITEMSTRUCT *)*plparam;
-            MEASUREITEMSTRUCT16 *mis = HeapAlloc( GetProcessHeap(), 0, sizeof(*mis)+sizeof(LPARAM));
-            if (!mis) return -1;
-            mis->CtlType    = (UINT16)mis32->CtlType;
-            mis->CtlID      = (UINT16)mis32->CtlID;
-            mis->itemID     = (UINT16)mis32->itemID;
-            mis->itemWidth  = (UINT16)mis32->itemWidth;
-            mis->itemHeight = (UINT16)mis32->itemHeight;
-            mis->itemData   = mis32->itemData;
-            *(LPARAM *)(mis + 1) = *plparam;  /* Store the previous lParam */
-            *plparam = MapLS( mis );
-        }
-        return 1;
     case WM_GETMINMAXINFO:
         {
             MINMAXINFO16 *mmi = HeapAlloc( GetProcessHeap(), 0, sizeof(*mmi) + sizeof(LPARAM) );
@@ -1294,9 +1230,6 @@ static void WINPROC_UnmapMsg32ATo16( HWN
         UnMapLS( (SEGPTR)lParam16 );
         break;
     case LB_SETTABSTOPS:
-    case WM_COMPAREITEM:
-    case WM_DELETEITEM:
-    case WM_DRAWITEM:
         {
             void *ptr = MapSL( lParam16 );
             UnMapLS( lParam16 );
@@ -1344,16 +1277,6 @@ static void WINPROC_UnmapMsg32ATo16( HWN
             *((PUINT)(lParam)) = HIWORD(*result);  /* FIXME: substract 1? */
         break;
 
-    case WM_MEASUREITEM:
-        {
-            MEASUREITEMSTRUCT16 *mis = MapSL(lParam16);
-            MEASUREITEMSTRUCT *mis32 = *(MEASUREITEMSTRUCT **)(mis + 1);
-            mis32->itemWidth  = mis->itemWidth;
-            mis32->itemHeight = mis->itemHeight;
-            UnMapLS( lParam16 );
-            HeapFree( GetProcessHeap(), 0, mis );
-        }
-        break;
     case WM_GETMINMAXINFO:
         {
             MINMAXINFO16 *mmi = MapSL(lParam16);
@@ -2357,6 +2280,75 @@ LRESULT WINPROC_CallProc32ATo16( winproc
             UnMapLS( cs.szClass );
         }
         break;
+    case WM_COMPAREITEM:
+        {
+            COMPAREITEMSTRUCT *cis32 = (COMPAREITEMSTRUCT *)lParam;
+            COMPAREITEMSTRUCT16 cis;
+            cis.CtlType    = cis32->CtlType;
+            cis.CtlID      = cis32->CtlID;
+            cis.hwndItem   = HWND_16( cis32->hwndItem );
+            cis.itemID1    = cis32->itemID1;
+            cis.itemData1  = cis32->itemData1;
+            cis.itemID2    = cis32->itemID2;
+            cis.itemData2  = cis32->itemData2;
+            lParam = MapLS( &cis );
+            ret = callback( HWND_16(hwnd), msg, wParam, lParam, result, arg );
+            UnMapLS( lParam );
+        }
+        break;
+    case WM_DELETEITEM:
+        {
+            DELETEITEMSTRUCT *dis32 = (DELETEITEMSTRUCT *)lParam;
+            DELETEITEMSTRUCT16 dis;
+            dis.CtlType  = dis32->CtlType;
+            dis.CtlID    = dis32->CtlID;
+            dis.itemID   = dis32->itemID;
+            dis.hwndItem = (dis.CtlType == ODT_MENU) ? (HWND16)LOWORD(dis32->hwndItem)
+                                                     : HWND_16( dis32->hwndItem );
+            dis.itemData = dis32->itemData;
+            lParam = MapLS( &dis );
+            ret = callback( HWND_16(hwnd), msg, wParam, lParam, result, arg );
+            UnMapLS( lParam );
+        }
+        break;
+    case WM_DRAWITEM:
+        {
+            DRAWITEMSTRUCT *dis32 = (DRAWITEMSTRUCT *)lParam;
+            DRAWITEMSTRUCT16 dis;
+            dis.CtlType       = dis32->CtlType;
+            dis.CtlID         = dis32->CtlID;
+            dis.itemID        = dis32->itemID;
+            dis.itemAction    = dis32->itemAction;
+            dis.itemState     = dis32->itemState;
+            dis.hwndItem      = HWND_16( dis32->hwndItem );
+            dis.hDC           = HDC_16(dis32->hDC);
+            dis.itemData      = dis32->itemData;
+            dis.rcItem.left   = dis32->rcItem.left;
+            dis.rcItem.top    = dis32->rcItem.top;
+            dis.rcItem.right  = dis32->rcItem.right;
+            dis.rcItem.bottom = dis32->rcItem.bottom;
+            lParam = MapLS( &dis );
+            ret = callback( HWND_16(hwnd), msg, wParam, lParam, result, arg );
+            UnMapLS( lParam );
+        }
+        break;
+    case WM_MEASUREITEM:
+        {
+            MEASUREITEMSTRUCT *mis32 = (MEASUREITEMSTRUCT *)lParam;
+            MEASUREITEMSTRUCT16 mis;
+            mis.CtlType    = mis32->CtlType;
+            mis.CtlID      = mis32->CtlID;
+            mis.itemID     = mis32->itemID;
+            mis.itemWidth  = mis32->itemWidth;
+            mis.itemHeight = mis32->itemHeight;
+            mis.itemData   = mis32->itemData;
+            lParam = MapLS( &mis );
+            ret = callback( HWND_16(hwnd), msg, wParam, lParam, result, arg );
+            UnMapLS( lParam );
+            mis32->itemWidth  = mis.itemWidth;
+            mis32->itemHeight = mis.itemHeight;
+        }
+        break;
     default:
         {
             UINT16 msg16;




More information about the wine-cvs mailing list