diff --git a/reactos/dll/directx/ddraw/ddraw.rbuild b/reactos/dll/directx/ddraw/ddraw.rbuild
index 29ed5af929e..1b9bcb2cf70 100644
--- a/reactos/dll/directx/ddraw/ddraw.rbuild
+++ b/reactos/dll/directx/ddraw/ddraw.rbuild
@@ -37,6 +37,7 @@
ddraw_hel.c
surface_hel.c
+ surface_callbacks_hel.c
diff --git a/reactos/dll/directx/ddraw/hal/surface_hal.c b/reactos/dll/directx/ddraw/hal/surface_hal.c
index ae92639f312..fdc2cc2b35b 100644
--- a/reactos/dll/directx/ddraw/hal/surface_hal.c
+++ b/reactos/dll/directx/ddraw/hal/surface_hal.c
@@ -22,8 +22,16 @@ HRESULT Hal_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDS
mDdCanCreateSurface.lpDD = &This->mDDrawGlobal;
- mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface;
-
+
+ if (This->mDDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE)
+ {
+ mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HALDD.CanCreateSurface;
+ }
+ else
+ {
+ mDdCanCreateSurface.CanCreateSurface = This->mCallbacks.HELDD.CanCreateSurface;
+ }
+
mDdCreateSurface.lpDD = &This->mDDrawGlobal;
mDdCreateSurface.CreateSurface = This->mCallbacks.HALDD.CreateSurface;
@@ -335,15 +343,22 @@ HRESULT Hal_DDrawSurface_Lock(LPDIRECTDRAWSURFACE7 iface, LPRECT prect, LPDDSURF
Lock.Lock = This->owner->mCallbacks.HALDDSurface.Lock;
Lock.dwFlags = flags;
Lock.lpDDSurface = This->Surf->mpPrimaryLocals[0];
- Lock.lpDD = &This->owner->mDDrawGlobal;
- // FIXME lpSurfData
- //Lock.lpSurfData =
+ Lock.lpDD = &This->owner->mDDrawGlobal;
+ Lock.lpSurfData = NULL;
- if (This->owner->mCallbacks.HALDDSurface.Lock(&Lock)!= DDHAL_DRIVER_NOTHANDLED)
+ if (This->owner->mCallbacks.HALDDSurface.Lock(&Lock)!= DDHAL_DRIVER_HANDLED)
{
return Lock.ddRVal;
}
- // FIXME LPDDSURFACEDESC2
+
+ RtlZeroMemory(pDDSD,sizeof(DDSURFACEDESC2));
+ memcpy(pDDSD,&This->Surf->mddsdPrimary,sizeof(DDSURFACEDESC));
+ pDDSD->dwSize = sizeof(DDSURFACEDESC2);
+
+ pDDSD->lpSurface = Lock.lpSurfData;
+
+
+ // FIXME some things is wrong it does not show the data on screen ??
return DD_OK;
}
diff --git a/reactos/dll/directx/ddraw/main/ddraw_main.c b/reactos/dll/directx/ddraw/main/ddraw_main.c
index 481f88d18db..778b31b00ed 100644
--- a/reactos/dll/directx/ddraw/main/ddraw_main.c
+++ b/reactos/dll/directx/ddraw/main/ddraw_main.c
@@ -10,10 +10,11 @@
#include "rosdraw.h"
-static const DDPIXELFORMAT pixelformats[] =
+const DDPIXELFORMAT pixelformats[] =
{
/* 8bpp paletted */
- { sizeof(DDPIXELFORMAT), DDPF_RGB|DDPF_PALETTEINDEXED8, 0, { 8 } },
+ { sizeof(DDPIXELFORMAT), DDPF_RGB, 0, { 24 }, { 0xFF0000 },
+ { 0x00FF00 }, { 0x0000FF } },
/* 15bpp 5/5/5 */
{ sizeof(DDPIXELFORMAT), DDPF_RGB, 0, { 16 }, { 0x7C00 }, { 0x3E0 },
{ 0x1F } },
@@ -28,6 +29,37 @@ static const DDPIXELFORMAT pixelformats[] =
{ 0x00FF00 }, { 0x0000FF } }
};
+const DWORD pixelformatsCount = sizeof(pixelformats) / sizeof(DDPIXELFORMAT);
+
+/* more surface format not adding it */
+ /* 4 bit paletted 0 */
+ // sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_PALETTEINDEXED4, 0, 4, 0x00, 0x00, 0x00, 0x00
+
+ ///* 8bpp paletted 1 */
+ //{sizeof(DDPIXELFORMAT), DDPF_RGB|DDPF_PALETTEINDEXED8, 0, 8, 0, 0, 0, 0},
+
+ ///* 15bpp 5:5:5 RGB 2 */
+ //{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x7c00, 0x03e0, 0x001f, 0},
+
+ ///* 15bpp 1:5:5:5 ARGB 3 */
+ //{sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0, 16, 0x7c00, 0x03e0, 0x001f, 0x8000},
+
+ ///* 16bpp 5:6:5 RGB 4 */
+ //{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0xf800, 0x07e0, 0x001f, 0}
+
+ ///* 16bpp 4:4:4:4 ARGB 5 */
+ //{sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS,´0, 16, 0x0f00, 0x00f0, 0x000f, 0xf000},
+
+ /* 24bpp 8/8/8 RGB 6 */
+ // {sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 24 , 0x00FF0000, 0x0000FF00 , 0x000000FF, 0 },
+
+ /* 32bpp 8:8:8 RGB 7 */
+ // {sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0},
+
+ /* 32bpp 8:8:8:8 ARGB 8*/
+ // {sizeof(DDPIXELFORMAT), DDPF_RGB | DDPF_ALPHAPIXELS, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000}
+
+
/*
@@ -625,7 +657,7 @@ HRESULT WINAPI Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFla
break;
case 32:
- memcpy(&desc_callback.ddpfPixelFormat,&pixelformats[3],sizeof(DDPIXELFORMAT));
+ memcpy(&desc_callback.ddpfPixelFormat,&pixelformats[4],sizeof(DDPIXELFORMAT));
break;
default:
diff --git a/reactos/dll/directx/ddraw/rosdraw.h b/reactos/dll/directx/ddraw/rosdraw.h
index 178865ed992..bfee438faed 100644
--- a/reactos/dll/directx/ddraw/rosdraw.h
+++ b/reactos/dll/directx/ddraw/rosdraw.h
@@ -187,6 +187,10 @@ HRESULT Hel_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
HRESULT Hel_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface, LPDIRECTDRAWSURFACE7 override, DWORD dwFlags);
HRESULT Hel_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags);
+/* HEL CALLBACK */
+DWORD CALLBACK HelDdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA pccsd);
+
+
/* Setting for HEL should be move to ros special reg key ? */
/* setup how much graphic memory should hel be limit, set it now to 64MB */
diff --git a/reactos/dll/directx/ddraw/soft/ddraw_hel.c b/reactos/dll/directx/ddraw/soft/ddraw_hel.c
index fb1804ff565..0bc8e94b19a 100644
--- a/reactos/dll/directx/ddraw/soft/ddraw_hel.c
+++ b/reactos/dll/directx/ddraw/soft/ddraw_hel.c
@@ -18,6 +18,11 @@ HRESULT Hel_DirectDraw_Initialize (LPDIRECTDRAW7 iface)
This->HELMemoryAvilable = HEL_GRAPHIC_MEMORY_MAX;
+
+ This->mCallbacks.HELDD.dwFlags = DDHAL_CB32_CANCREATESURFACE;
+ This->mCallbacks.HELDD.CanCreateSurface = HelDdCanCreateSurface;
+
+
return DD_OK;
}
diff --git a/reactos/dll/directx/ddraw/soft/surface_hel.c b/reactos/dll/directx/ddraw/soft/surface_hel.c
index 1e6aea649a7..2fab1495d4c 100644
--- a/reactos/dll/directx/ddraw/soft/surface_hel.c
+++ b/reactos/dll/directx/ddraw/soft/surface_hel.c
@@ -56,3 +56,7 @@ HRESULT Hel_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface, DWORD
+
+
+
+