Author: greatlrd
Date: Wed Nov 19 11:56:56 2008
New Revision: 37460
URL:
http://svn.reactos.org/svn/reactos?rev=37460&view=rev
Log:
Fixed bug in hel surface lock.
Now we truly get back a buffer with bitmap data for specify bitmap area. and few other
mirror bugfix for DdLock hel function
Modified:
branches/reactx/reactos/dll/directx/ddraw/Surface/callbacks_surf_hel.c
branches/reactx/reactos/dll/directx/ddraw/Surface/surface_main.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/ddra…
==============================================================================
--- 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 11:56:56 2008
@@ -16,6 +16,8 @@
DWORD CALLBACK HelDdSurfBlt(LPDDHAL_BLTDATA lpBltData)
{
+ DX_WINDBG_trace();
+
if (lpBltData->dwFlags & DDBLT_COLORFILL)
{
HBRUSH hbr = CreateSolidBrush(lpBltData->bltFX.dwFillColor );
@@ -63,77 +65,95 @@
DWORD CALLBACK HelDdSurfLock(LPDDHAL_LOCKDATA lpLockData)
{
+
HDC hDC;
- BITMAP bm;
- PDWORD pixels = NULL;
- HGDIOBJ hBmp;
- BITMAPINFO bmi;
- int retvalue = 0;
+ HBITMAP hImage = NULL;
+
+ LONG cbBuffer = 0;
+ LPDWORD pixels = NULL;
+
+ HDC hMemDC = NULL;
+ HBITMAP hDCBmp = NULL;
+ BITMAP bm = {0};
+
+ DX_WINDBG_trace();
/* ToDo tell ddraw internal this surface are locked */
/* ToDo add support for dwFlags */
+
/* Get our hdc for the surface */
hDC = (HDC)lpLockData->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) )
- {
- /* Alloc memory buffer at usermode for the bitmap pixel data */
- pixels = (PDWORD) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bm.bmWidth *
bm.bmHeight * (bm.bmBitsPixel*bm.bmBitsPixel ) );
-
- if (pixels != NULL)
- {
- /* 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)
+ if (hDC != NULL)
+ {
+ /* Create a memory bitmap to store a copy of current hdc surface */
+
+ if (!lpLockData->bHasRect)
+ {
+
+ hImage = CreateCompatibleBitmap (hDC,
lpLockData->lpDDSurface->lpGbl->wWidth,
lpLockData->lpDDSurface->lpGbl->wHeight);
+ }
+ else
+ {
+ hImage = CreateCompatibleBitmap (hDC, lpLockData->rArea.right,
lpLockData->rArea.bottom);
+ }
+
+ /* 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);
+
+ if (!lpLockData->bHasRect)
{
- /* Extract the bitmap bits data from palete bitmap */
- retvalue = GetDIBits(hDC, hBmp, 0, bm.bmHeight, pixels, &bmi,
DIB_PAL_COLORS);
+ BitBlt (hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, hDC, 0, 0, SRCCOPY);
}
else
{
- /* Extract the bitmap bits data from RGB bitmap */
- retvalue = GetDIBits(hDC, hBmp, 0, bm.bmHeight, pixels, &bmi,
DIB_RGB_COLORS);
+ BitBlt (hMemDC, lpLockData->rArea.top, lpLockData->rArea.left,
lpLockData->rArea.right, lpLockData->rArea.bottom, hDC, 0, 0, SRCCOPY);
}
- /* Check see if we susccess it to get the memory pointer and fill it for the
bitmap pixel data */
- if (retvalue)
+ SelectObject (hMemDC, hDCBmp);
+
+ /* Alloc memory buffer at usermode for the bitmap pixel data */
+ cbBuffer = bm.bmWidthBytes * bm.bmHeight ;
+ pixels = (PDWORD) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, cbBuffer );
+
+ if (pixels != NULL)
{
- /* Check see if the are special area it should have been extracted or not
*/
- if (!lpLockData->bHasRect)
- {
- /* The all bitmap pixel data must return */
- lpLockData->lpSurfData = pixels;
- lpLockData->ddRVal = DD_OK;
- }
- else
- {
- /* Only the lpLockData->rArea bitmap data should be return */
- DX_STUB;
- }
+ /* Get the bitmap bits */
+ GetBitmapBits(hImage,cbBuffer,pixels);
+
+ /* Setup return value */
+ lpLockData->ddRVal = DD_OK;
+ lpLockData->lpSurfData = pixels;
}
}
}
+
/* Free the pixels buffer if we fail */
if ( (pixels != NULL) &&
(lpLockData->ddRVal != DD_OK) )
{
HeapFree(GetProcessHeap(), 0, pixels );
+ }
+
+ /* Cleanup after us */
+ if (hImage != NULL)
+ {
+ DeleteObject (hImage);
+ }
+
+ if (hMemDC != NULL)
+ {
+ DeleteDC (hMemDC);
}
return DDHAL_DRIVER_HANDLED;
Modified: branches/reactx/reactos/dll/directx/ddraw/Surface/surface_main.c
URL:
http://svn.reactos.org/svn/reactos/branches/reactx/reactos/dll/directx/ddra…
==============================================================================
--- branches/reactx/reactos/dll/directx/ddraw/Surface/surface_main.c [iso-8859-1]
(original)
+++ branches/reactx/reactos/dll/directx/ddraw/Surface/surface_main.c [iso-8859-1] Wed Nov
19 11:56:56 2008
@@ -415,6 +415,12 @@
/* Zero out members in DDHAL_LOCKDATA */
ZeroMemory(&mdLock, sizeof(DDHAL_LOCKDATA));
+ if ( (ThisDest->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags
&
+ DDHAL_SURFCB32_UNLOCK) == DDHAL_SURFCB32_UNLOCK)
+ {
+ ThisDest->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags
-=DDHAL_SURFCB32_UNLOCK;
+ ThisDest->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags
-=DDHAL_SURFCB32_LOCK;
+ }
/* Check if we got HAL support for this api */
if (( ThisDest->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags
&
DDHAL_SURFCB32_LOCK) == DDHAL_SURFCB32_LOCK)
@@ -463,7 +469,7 @@
if (!DdResetVisrgn(ThisDest->lpLcl->lpSurfMore->slist[0], NULL))
{
DX_STUB_str("Here DdResetVisrgn lock");
- return DDERR_UNSUPPORTED;
+ // return DDERR_UNSUPPORTED;
}
if (mdLock.Lock(&mdLock)!= DDHAL_DRIVER_HANDLED)
@@ -518,6 +524,12 @@
ZeroMemory(&mdUnLock, sizeof(DDHAL_UNLOCKDATA));
/* Check if we got HAL support for this api */
+ if ( (This->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags &
+ DDHAL_SURFCB32_UNLOCK) == DDHAL_SURFCB32_UNLOCK)
+ {
+ This->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags
-=DDHAL_SURFCB32_UNLOCK;
+ This->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags
-=DDHAL_SURFCB32_LOCK;
+ }
if (( This->lpLcl->lpGbl->lpDD->lpDDCBtmp->HALDDSurface.dwFlags &
DDHAL_SURFCB32_UNLOCK) == DDHAL_SURFCB32_UNLOCK)
{