[ros-diffs] [greatlrd] 37461: Fixed hack so DdUnlock hel does not leak memory, ToDO : DdLock hel captuer the screen outside the client area, DdUnlock also need write back to the client area.

greatlrd at svn.reactos.org greatlrd at svn.reactos.org
Wed Nov 19 19:28:34 CET 2008


Author: greatlrd
Date: Wed Nov 19 12:28:34 2008
New Revision: 37461

URL: http://svn.reactos.org/svn/reactos?rev=37461&view=rev
Log:
Fixed hack so DdUnlock hel does not leak memory, 
ToDO : DdLock hel captuer the screen outside the client area, DdUnlock also need write back to the client area. 

Modified:
    branches/reactx/reactos/dll/directx/ddraw/Surface/callbacks_surf_hel.c

Modified: branches/reactx/reactos/dll/directx/ddraw/Surface/callbacks_surf_hel.c
URL: http://svn.reactos.org/svn/reactos/branches/reactx/reactos/dll/directx/ddraw/Surface/callbacks_surf_hel.c?rev=37461&r1=37460&r2=37461&view=diff
==============================================================================
--- branches/reactx/reactos/dll/directx/ddraw/Surface/callbacks_surf_hel.c [iso-8859-1] (original)
+++ branches/reactx/reactos/dll/directx/ddraw/Surface/callbacks_surf_hel.c [iso-8859-1] Wed Nov 19 12:28:34 2008
@@ -130,6 +130,9 @@
                 /* Get the bitmap bits */
                 GetBitmapBits(hImage,cbBuffer,pixels);
 
+                /* Fixme HACK check which member that store the hel bitmap buffer */
+                lpLockData->lpDDSurface->lpSurfMore->lpDDRAWReserved2 = pixels;
+
                 /* Setup return value */
                 lpLockData->ddRVal = DD_OK;
                 lpLockData->lpSurfData = pixels;
@@ -191,48 +194,62 @@
 DWORD CALLBACK HelDdSurfUnlock(LPDDHAL_UNLOCKDATA lpUnLockData)
 {
     HDC hDC;
-    BITMAP bm;
-    PDWORD pixels = NULL;
-    HGDIOBJ hBmp;
-    BITMAPINFO bmi;
-    int retvalue = 0;
+    HBITMAP hImage = NULL;
+
+    HDC hMemDC = NULL;
+    HBITMAP hDCBmp = NULL;
+    BITMAP bm = {0};
+
+    DX_WINDBG_trace();
 
     /* Get our hdc for the surface */
-    hDC = (HDC)lpUnLockData->lpDDSurface->lpSurfMore->lpDD_lcl->hDC;
-
-    /* Get our bitmap handle from hdc, we need it if we want extract the Bitmap pixel data */
-    hBmp = GetCurrentObject(hDC, OBJ_BITMAP);
-
-    /* Get our bitmap information from hBmp, we need it if we want extract the Bitmap pixel data */
-    if (GetObject(hBmp, sizeof(BITMAP), &bm) )
-    {
-        /* Zero out all members in bmi so no junk data are left */
-        ZeroMemory(&bmi, sizeof(BITMAPINFO));
-
-        /* Setup BITMAPINFOHEADER for bmi header */
-        bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-        bmi.bmiHeader.biWidth = bm.bmWidth;
-        bmi.bmiHeader.biHeight = bm.bmHeight;
-        bmi.bmiHeader.biPlanes = bm.bmPlanes;
-        bmi.bmiHeader.biBitCount = bm.bmBitsPixel;
-        bmi.bmiHeader.biCompression = BI_RGB;
-
-        /* Check if it the bitmap is palete or not */
-        if ( bm.bmBitsPixel <= 8)
-        {
-            /* Upload the bitmap bits data from palete bitmap */
-            retvalue = SetDIBits(hDC, hBmp, 0, bm.bmHeight, pixels, &bmi, DIB_PAL_COLORS);
-        }
-        else
-        {
-            /* Upload the bitmap bits data from RGB bitmap */
-            retvalue = SetDIBits(hDC, hBmp, 0, bm.bmHeight, pixels, &bmi, DIB_RGB_COLORS);
-        }
-    }
-    if (retvalue)
-    {
-        lpUnLockData->ddRVal = DD_OK;
-    }
+    hDC = (HDC) lpUnLockData->lpDDSurface->lpSurfMore->lpDD_lcl->hDC;
+
+    if (hDC != NULL)
+    {
+        /* Create a memory bitmap to store a copy of current hdc surface */
+
+        /* fixme the rcarea are not store in the struct yet so the data will look corupted */
+        hImage = CreateCompatibleBitmap (hDC, lpUnLockData->lpDDSurface->lpGbl->wWidth, lpUnLockData->lpDDSurface->lpGbl->wHeight);
+
+        /* Create a memory hdc so we can draw on our current memory bitmap */
+        hMemDC = CreateCompatibleDC(hDC);
+
+        if (hMemDC != NULL)
+        {
+            /* Select our memory bitmap to our memory hdc */
+            hDCBmp = (HBITMAP) SelectObject (hMemDC, hImage);
+
+            /* Get our memory bitmap information */
+            GetObject(hImage, sizeof(BITMAP), &bm);
+
+            SetBitmapBits(hImage,bm.bmWidthBytes * bm.bmHeight, lpUnLockData->lpDDSurface->lpSurfMore->lpDDRAWReserved2);
+
+            BitBlt (hDC, 0, 0, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
+
+            SelectObject (hMemDC, hDCBmp);
+
+            /* Setup return value */
+             lpUnLockData->ddRVal = DD_OK;
+        }
+    }
+
+    /* Cleanup after us */
+    if (hImage != NULL)
+    {
+        DeleteObject (hImage);
+    }
+
+    if (hMemDC != NULL)
+    {
+        DeleteDC (hMemDC);
+    }
+
+    if (lpUnLockData->lpDDSurface->lpSurfMore->lpDDRAWReserved2 != NULL)
+    {
+        HeapFree(GetProcessHeap(), 0, lpUnLockData->lpDDSurface->lpSurfMore->lpDDRAWReserved2 );
+    }
+
     return DDHAL_DRIVER_HANDLED;
 }
 



More information about the Ros-diffs mailing list